GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So überprüfen Sie, ob sed eine Datei geändert hat

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) den old pattern enthält , ersetzen Sie es durch new 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 von 1 , wechseln Sie andernfalls zurück zum ursprünglichen PS und beenden Sie es mit dem Exit-Code 0 (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"

Linux
  1. So überprüfen Sie die Syntax von Sudoers

  2. Wie lösche ich eine Datei, deren Dateiname nicht druckbare Zeichen enthält?

  3. Wie überprüfe ich den Fortschritt des Laufens von Cp?

  4. Wie überprüfe ich die Teilzeichenfolge in Shell Script Bash?

  5. Wie grep \n in Datei

So überprüfen Sie, ob eine Datei oder ein Verzeichnis in Bash vorhanden ist

So überprüfen/reparieren Sie das Linux-Dateisystem beim Booten

So überprüfen und reparieren Sie ein Dateisystem in RHEL Linux

So überprüfen Sie, ob eine Datei oder ein Verzeichnis in der Bash-Shell vorhanden ist

Unix Sed Tutorial:So schreiben Sie mit Sed in eine Datei

So verwenden Sie Sed zum Suchen und Ersetzen einer Zeichenfolge in einer Datei