มันเป็นไปได้ที่จะใช้gawkของ-i inplaceตัวเลือกและพิมพ์สิ่งที่stdout?
ตัวอย่างเช่นถ้าฉันต้องการอัปเดตไฟล์และหากมีการเปลี่ยนแปลงใด ๆ ให้พิมพ์ชื่อไฟล์และบรรทัดที่เปลี่ยนแปลงไปที่stderrฉันสามารถทำสิ่งต่าง ๆ เช่น
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;}' {} +
แต่มีวิธีใช้stdoutแทนหรือวิธีที่สะอาดกว่าในการพิมพ์บล็อกนั้นไปยังสตรีมสำรอง
grepสามารถ สัญชาตญาณแรกของฉันคือการหลีกเลี่ยงการ "ประมวลผล" ไฟล์สองครั้ง แต่ฉันจะไม่แปลกใจเลยถ้ามันเร็วขึ้นแน่นอน มันแสดงให้เห็นว่าทำไมฉันถึงเชื่อในลำไส้ของฉันในการทำโปรไฟล์
-print -exec gawkไม่ได้ดำเนินการอีกต่อไป) และ 2) จะหยุดในการจับคู่ที่ 1 ดังนั้นหากการจับคู่ที่ 1 อยู่บน บรรทัดสุดท้ายคุณยังคงไม่ประมวลผลไฟล์ทั้งหมดสองครั้ง (มากกว่า 1.X เท่า) นอกจากนี้หากgawk -i inplaceทำงานเหมือนsed -iมันจะแก้ไขไฟล์ในสถานที่ต่อไป - เช่นการปรับปรุงการประทับเวลา inode ฯลฯ แม้ว่าจะไม่มีอะไรที่จะแก้ไข ...
find -type f -name 'myfiles' -exec grep -q 'pattern' {} \; -print -exec gawk -i inplace '{do_your_sub_and_print_to_dev/stderr_too}' {} \;นั้นคุณจะใช้ awk เพื่อแก้ไขไฟล์ที่มีบรรทัดที่ตรงกับรูปแบบนั้นเท่านั้น