GNU awk
(พบได้ทั่วไปในระบบ Linux) ตั้งแต่รุ่น 4.1.0 สามารถรวม " awk
ซอร์สไลบรารี" กับ-i
หรือ--include
บนบรรทัดคำสั่ง หนึ่งในไลบรารี่ต้นทางที่แจกจ่ายกับ GNU awk
นั้นเรียกว่าinplace
:
$ cat file
hello
there
$ awk -i inplace '/hello/ { print "oh,", $0 }' file
$ cat file
oh, hello
อย่างที่คุณเห็นสิ่งนี้ทำให้การส่งออกของawk
รหัสแทนที่ไฟล์อินพุต บรรทัดที่พูดthere
ไม่ได้ถูกเก็บไว้เนื่องจากไม่ได้แสดงผลลัพธ์โดยโปรแกรม
ด้วยawk
สคริปต์ในไฟล์คุณจะใช้มันเหมือน
awk -i inplace -f script.awk datafile
หากawk
ตัวแปรINPLACE_SUFFIX
ถูกตั้งค่าเป็นสตริงไลบรารีจะทำการสำรองข้อมูลของไฟล์ต้นฉบับโดยใช้ส่วนต่อท้ายเป็นชื่อไฟล์
awk -i inplace -v INPLACE_SUFFIX=.bak -f script.awk datafile
หากคุณมีไฟล์อินพุตหลายไฟล์แต่ละไฟล์จะถูกแก้ไขแบบแทนที่ทีละไฟล์ แต่คุณสามารถปิดการแก้ไขแบบแทนไฟล์ (หรือชุดไฟล์) โดยใช้inplace=0
บนบรรทัดคำสั่งหน้าไฟล์นั้น:
awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4
ในคำสั่งข้างต้นfile3
จะไม่ถูกแก้ไขในสถานที่
สำหรับการพกพา "แก้ไขแบบแทนที่" ของไฟล์เดียวให้ใช้
tmpfile=$(mktemp)
cp file "$tmpfile" &&
awk '...some program here...' "$tmpfile" >file
rm "$tmpfile"
สิ่งนี้จะคัดลอกไฟล์อินพุตไปยังตำแหน่งชั่วคราวจากนั้นใช้awk
โค้ดบนไฟล์ชั่วคราวในขณะที่เปลี่ยนเส้นทางไปยังชื่อไฟล์ดั้งเดิม
การดำเนินการตามลำดับนี้ (ทำงานawk
กับไฟล์ชั่วคราวไม่ใช่ไฟล์ต้นฉบับ) ทำให้แน่ใจได้ว่าไฟล์ meta-data (สิทธิ์และความเป็นเจ้าของ) ของไฟล์ต้นฉบับไม่ได้ถูกแก้ไข