มันเป็นไปได้ที่จะใช้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 เพื่อแก้ไขไฟล์ที่มีบรรทัดที่ตรงกับรูปแบบนั้นเท่านั้น