เป็นไปได้ไหม ฉันอ่านบางที่คำสั่งต่อไปนี้จะทำ:
sed -e [คำสั่ง] [ไฟล์]
แต่ดูเหมือนว่าจะทำเช่นเดียวกับเพียง
sed [คำสั่ง] [ไฟล์]
(ไม่ได้บันทึกการเปลี่ยนแปลง) มีวิธีการทำเช่นนี้โดยใช้ sed หรือไม่
เป็นไปได้ไหม ฉันอ่านบางที่คำสั่งต่อไปนี้จะทำ:
sed -e [คำสั่ง] [ไฟล์]
แต่ดูเหมือนว่าจะทำเช่นเดียวกับเพียง
sed [คำสั่ง] [ไฟล์]
(ไม่ได้บันทึกการเปลี่ยนแปลง) มีวิธีการทำเช่นนี้โดยใช้ sed หรือไม่
คำตอบ:
ฉันคิดว่าคุณกำลังมองหา-i
:
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if SUFFIX supplied)
ตัวอย่างเช่น:
$ cat foo.txt
hello world
$ sed -i 's/o/X/g' foo.txt
$ cat foo.txt
hellX wXrld
หากคุณระบุคำต่อท้ายมันจะสร้างไฟล์สำรอง:
$ ls
foo.txt
$ sed -i.bak 's/o/X/g' foo.txt
$ ls
foo.txt foo.txt.bak
ไฟล์อินพุตถูกแก้ไขและการสำรองข้อมูลที่มีข้อมูลไฟล์ต้นฉบับจะถูกสร้างขึ้น
โปรดทราบด้วยว่าสิ่งนี้มีไว้สำหรับ GNU sed
มีรูปแบบที่แตกต่างกันเล็กน้อยระหว่างsed
การใช้งานที่แตกต่างกัน
sed
ไม่ทำการแก้ไขในสถานที่ มันสร้างไฟล์ใหม่และเขียนทับไฟล์เก่าการเปลี่ยนแปลง inode
{ rm file; cmd > file; } < file
จะนำไปสู่ข้อสรุปที่ cmd อ่านและเขียนไฟล์เดียวกันซึ่งมันไม่ได้ มันเป็นไฟล์ distince สองไฟล์ที่เพิ่งมีชื่อเหมือนกัน แต่ฉันไม่ต้องการเริ่มการสนทนาที่นี่
sed: 1: "foo.txt": invalid command code f
sed -i 's/o/X/g' foo.txt
อย่างไรก็ตามการให้ส่วนขยายเช่นsed -i .bak 's/o/X/g' foo.txt
ทำงานได้ดี มีแนวคิดใดที่จะทำให้มันทำงานได้โดยไม่ต้องสร้างไฟล์สำรอง?
sed -i '' 's/o/X/g' foo.txt
โซลูชันเหล่านี้ใช้งานได้กับ HPUX (UNIX):
1.
{ rm test1.sh && awk '{gsub("Error", "NO_Error", $0); print}' > test1.sh; } < test1.sh
:
2
perl -pi -e 's/Error/NO_Error/g' test1.sh
3
sed 's/Error/NO_Error/g' test1.sh | tee test1.sh
-e
ตัวเลือกสำหรับการดำเนินการหลายsed
คำสั่ง
sed -e 's/linux/unix/' -e 's/os/OS/' file.txt
พิจารณาfile.txt
เป็น
linux os
ดังนั้น O / P คือ
unix os
-i
ตัวเลือกบันทึกการเปลี่ยนแปลงอย่างถาวร ...
-e
ธงยืนสำหรับการแสดงออก คุณอาจต้องการ-i
ธงซึ่งหมายความว่าin-place
และฉันขอแนะนำให้คุณใช้sed -i.bak 's/../' filename