Apakah mungkin untuk menggunakan gawk
's -i inplace
pilihan dan juga mencetak hal yang stdout
?
Misalnya, jika saya ingin memperbarui file, dan jika ada perubahan, cetak nama file dan baris yang diubah ke stderr
saya bisa melakukan sesuatu seperti
find -type f -name 'myfiles' -exec gawk -i inplace '{if(gsub(/pat/, "repl")) { print FILENAME > "/proc/self/fd/2" ; print > "/proc/self/fd/2"; } print;}' {} +
tetapi apakah ada cara untuk menggunakannya stdout
, atau cara yang lebih bersih untuk mencetak blok itu ke aliran alternatif?
grep
bisa. Naluri pertama saya adalah untuk menghindari "proses" file dua kali, tetapi saya tidak akan terkejut sama sekali jika memang lebih cepat. Itu hanya untuk menunjukkan mengapa saya bisa memercayai nyali saya pada tugas pembuatan profil
-print -exec gawk
tidak dieksekusi lagi) dan 2) itu akan berhenti pada pertandingan pertama jadi kecuali pertandingan pertama ada di baris terakhir Anda masih belum memproses seluruh file dua kali (ini lebih seperti 1,X kali). Juga, jika gawk -i inplace
berfungsi seperti sed -i
itu akan mengedit file di tempat - yaitu memperbarui cap waktu, inode dll bahkan jika tidak ada yang perlu diedit ...
find -type f -name 'myfiles' -exec grep -q 'pattern' {} \; -print -exec gawk -i inplace '{do_your_sub_and_print_to_dev/stderr_too}' {} \;
itu Anda hanya akan menggunakan awk untuk mengedit file yang benar-benar berisi garis yang cocok dengan pola itu.