Agak terlambat ke pesta, tetapi untuk kepentingan orang lain, saya menemukan bendera 'w' persis seperti yang saya cari.
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
akan berisi setiap perubahan (yaitu teks yang diubah) pada barisnya sendiri. Jika tidak ada perubahan, changelog.txt
akan menjadi nol byte.
Sumber daya sed yang sangat membantu (dan tempat saya menemukan info ini) adalah http://www.grymoire.com/Unix/Sed.html.
Ini mungkin berhasil untuk Anda (GNU sed):
sed -i.bak '/'"$old_pattern"'/{s//'"$new_pattern"'/;h};${x;/./{x;q1};x}' file || echo changed
Penjelasan:
/'"$old_pattern"'/{s//'"$new_pattern"'/;h}
jika ruang pola (PS) berisiold pattern
, ganti dengannew pattern
dan salin PS ke ruang tunggu (HS).${x;/./{x;q1};x}
saat menemukan baris terakhir, tukar ke HS dan uji keberadaan string apa pun. Jika sebuah string ditemukan di HS (yaitu telah terjadi substitusi) tukar kembali ke PS asli dan keluar menggunakan kode keluar1
, jika tidak tukar kembali ke PS asli dan keluar dengan kode keluar0
(default).
Saya yakin ekstensi sed GNU ini berguna bagi Anda
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.
dan
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.
Sepertinya persis seperti yang Anda cari.
Anda dapat membedakan file asli dengan keluaran sed untuk melihat apakah itu berubah:
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"
Di mana saya menemukan versi pohon sumber kernel Linux?
Cara gzip semua file di semua sub-direktori menjadi satu file terkompresi di bash