GNU/Linux >> Belajar Linux >  >> Linux

Cara memeriksa apakah sed telah mengubah file

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) berisi old pattern , ganti dengan new 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 keluar 1 , jika tidak tukar kembali ke PS asli dan keluar dengan kode keluar 0 (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"

Linux
  1. Bagaimana cara memeriksa apakah Bash memiliki Kerentanan Shellshock?

  2. Bagaimana Cara Menghapus File Yang Nama Filenya Memiliki Karakter Non-cetak?

  3. Bagaimana Cara Memeriksa Kemajuan Running Cp?

  1. Bagaimana cara memeriksa syslog di Bash di Linux?

  2. Bagaimana cara menyisipkan teks di awal file?

  3. Bagaimana cara memeriksa apakah suatu file kosong di Bash?

  1. Bagaimana cara memeriksa sintaks sudoers

  2. Bagaimana cara menggunakan sed untuk mengganti variabel file konfigurasi?

  3. Bagaimana saya bisa menggunakan sudo untuk memeriksa apakah ada file?