gawk'S -i inplaceseçeneğini kullanmak ve bir şeyler yazdırmak mümkün stdoutmü?
Ö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 stderrgibi 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 stdoutbunun yerine kullanmanın bir yolu veya bu bloğu alternatif akışa yazdırmanın daha temiz bir yolu var mı?
grepolabileceğ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 gawkyü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 inplaceböyle çalışırsa sed -iyine 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.