GNU/Linux >> Znalost Linux >  >> Linux

Jak zkontrolovat, zda sed změnil soubor

Trochu pozdě na večírek, ale ve prospěch ostatních jsem zjistil, že vlajka „w“ je přesně to, co jsem hledala.

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 bude obsahovat každou změnu (tj. změněný text) na vlastním řádku. Pokud nedošlo k žádným změnám, changelog.txt bude mít nula bajtů.

Opravdu užitečný zdroj sed (a kde jsem našel tyto informace) je http://www.grymoire.com/Unix/Sed.html.


Toto by vám mohlo fungovat (GNU sed):

sed -i.bak '/'"$old_pattern"'/{s//'"$new_pattern"'/;h};${x;/./{x;q1};x}' file || echo changed

Vysvětlení:

  • /'"$old_pattern"'/{s//'"$new_pattern"'/;h} pokud prostor vzoru (PS) obsahuje old pattern , nahraďte jej new pattern a zkopírujte PS do úložného prostoru (HS).
  • ${x;/./{x;q1};x} při setkání s posledním řádkem přepněte na HS a otestujte jej na přítomnost jakéhokoli řetězce. Pokud je v HS nalezen řetězec (tj. došlo k záměně), swapujte zpět na původní PS a ukončete pomocí výstupního kódu 1 , jinak přepněte zpět na původní PS a ukončete s kódem ukončení 0 (výchozí).

Věřím, že tato rozšíření GNU sed pro vás mohou být užitečná

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.

a

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.

Vypadá to jako přesně to, co hledáte.


Můžete porovnat původní soubor s výstupem sed a zjistit, zda se změnil:

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. Jak zkontrolovat, zda má Bash zranitelnost Shellshock?

  2. Jak nahradit řetězec v souboru (souborech)?

  3. Jak zkontrolovat syslog v Bash na Linuxu?

  1. Jak zkontrolovat, zda je soubor prázdný v Bash?

  2. Jak použít sed k nahrazení proměnné konfiguračního souboru?

  3. Jak mohu použít sudo ke kontrole, zda soubor existuje?

  1. Jak zkontrolovat syntaxi sudoers

  2. Jak odstranit soubor, který má netisknutelné znaky?

  3. Jak zkontrolovat průběh běhu Cp?