gawk
'S -i inplace
seçeneğini kullanmak ve bir şeyler yazdırmak mümkün stdout
mü?
Örneğin, bir dosyayı güncellemek istersem ve herhangi bir değişiklik olursa dosyanın adını ve değiştirilen satırları yazdırır stderr
gibi bir şey yapabilirim
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;}' {} +
ancak stdout
bunun yerine kullanmanın bir yolu veya bu bloğu alternatif akışa yazdırmanın daha temiz bir yolu var mı?
grep
olabileceğini unuturum . İlk içgüdüm dosyayı iki kez "işlemekten" kaçınmaktır, ancak yine de daha hızlı olsaydı hiç şaşırmam. Sadece profilleme görevlerindeki bağırsağıma neden güvenebileceğimi gösteriyor
-print -exec gawk
yürütülmez) ve 2) 1. maçta durur, böylece 1. maç son satır hala tüm dosyayı iki kez işlemiyorsunuz (daha çok 1.X gibi). Ayrıca, eğer gawk -i inplace
böyle çalışırsa sed -i
yine de dosyayı yerinde düzenleyecektir - yani düzenlemek için hiçbir şey olmasa bile zaman damgalarını, inode vb güncelleme ...
find -type f -name 'myfiles' -exec grep -q 'pattern' {} \; -print -exec gawk -i inplace '{do_your_sub_and_print_to_dev/stderr_too}' {} \;
, sadece bu kalıpla eşleşen satırları içeren dosyaları düzenlemek için sadece awk kullanırsınız.