GNU/Linux >> Linux の 問題 >  >> Linux

sed がファイルを変更したかどうかを確認する方法

パーティーには少し遅れましたが、他の人の利益のために、「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"

Linux
  1. sudoers構文を確認する方法

  2. ファイル内の文字列を置き換える方法は?

  3. 印刷されない文字が含まれているファイル名のファイルを削除するにはどうすればよいですか?

  1. Cpの実行の進行状況を確認する方法は?

  2. Linux の Bash で syslog を確認するには?

  3. ファイルの先頭にテキストを挿入する方法は?

  1. Bashでファイルが空かどうかを確認するには?

  2. ファイル内で \n を grep する方法

  3. sudo を使用してファイルが存在するかどうかを確認するにはどうすればよいですか?