パーティーには少し遅れましたが、他の人の利益のために、「w」フラグがまさに私が探していたものであることがわかりました.
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
それぞれの変更 (つまり、変更されたテキスト) がそれぞれの行に含まれます。変更がなければ changelog.txt
0 バイトになります。
非常に役立つ sed リソース (およびこの情報を見つけた場所) は、http://www.grymoire.com/Unix/Sed.html です。
これはうまくいくかもしれません (GNU sed):
sed -i.bak '/'"$old_pattern"'/{s//'"$new_pattern"'/;h};${x;/./{x;q1};x}' file || echo changed
説明:
/'"$old_pattern"'/{s//'"$new_pattern"'/;h}
パターンスペース (PS) にold pattern
が含まれている場合 、new pattern
に置き換えます PS をホールド スペース (HS) にコピーします。${x;/./{x;q1};x}
最後の行に遭遇したら、HS にスワップし、文字列が存在するかどうかをテストします。 HS で文字列が見つかった場合 (つまり、置換が行われた場合)、元の PS にスワップ バックし、1
の終了コードを使用して終了します。 、それ以外の場合は元の PS にスワップ バックし、0
の終了コードで終了します (デフォルト)
これらの GNU sed 拡張機能が役に立つと思うかもしれません
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.
そして
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.
まさにあなたが探しているもののようです。
元のファイルと sed 出力を比較して、変更されたかどうかを確認できます。
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"