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) obsahujeold pattern
, nahraďte jejnew 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ódu1
, 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"
Kde najdu verzi zdrojového stromu linuxového jádra?
Jak gzipovat všechny soubory ve všech podadresářích do jednoho komprimovaného souboru v bash