Ein bisschen spät zur Party, aber zum Wohle anderer fand ich, dass die 'w'-Flagge genau das ist, wonach ich gesucht habe.
sed -i "s/$pattern/$new_pattern/w changelog.txt" "$filename"
if [ -s changelog.txt ]; then
# CHANGES MADE, DO SOME STUFF HERE
else
# NO CHANGES MADE, DO SOME OTHER STUFF HERE
fi
changelog.txt
enthält jede Änderung (dh den geänderten Text) in einer eigenen Zeile. Wenn es keine Änderungen gab, changelog.txt
wird null Bytes sein.
Eine wirklich hilfreiche Sed-Ressource (und wo ich diese Informationen gefunden habe) ist http://www.grymoire.com/Unix/Sed.html.
Das könnte für Sie funktionieren (GNU sed):
sed -i.bak '/'"$old_pattern"'/{s//'"$new_pattern"'/;h};${x;/./{x;q1};x}' file || echo changed
Erklärung:
/'"$old_pattern"'/{s//'"$new_pattern"'/;h}
wenn der Musterraum (PS) denold pattern
enthält , ersetzen Sie es durchnew pattern
und kopieren Sie das PS in den Haltebereich (HS).${x;/./{x;q1};x}
Wenn Sie auf die letzte Zeile stoßen, wechseln Sie zum HS und testen Sie es auf das Vorhandensein einer Zeichenfolge. Wenn eine Zeichenfolge im HS gefunden wird (d. h. eine Ersetzung stattgefunden hat), wechseln Sie zurück zum ursprünglichen PS und verlassen Sie es mit dem Exit-Code von1
, wechseln Sie andernfalls zurück zum ursprünglichen PS und beenden Sie es mit dem Exit-Code0
(Standard).
Ich glaube, dass Sie diese GNU-sed-Erweiterungen nützlich finden werden
t label
If a s/// has done a successful substitution since the last input line
was read and since the last t or T command, then branch to label; if
label is omitted, branch to end of script.
und
q [exit-code]
Immediately quit the sed script without processing any more input, except
that if auto-print is not disabled the current pattern space will be printed.
The exit code argument is a GNU extension.
Es scheint genau das zu sein, wonach Sie suchen.
Sie können die Originaldatei mit der sed-Ausgabe vergleichen, um zu sehen, ob sie sich geändert hat:
sed -i.bak s:$pattern:$new_pattern: "$filename"
if ! diff "$filename" "$filename.bak" &> /dev/null; then
echo "changed"
else
echo "not changed"
fi
rm "$filename.bak"