ฉันจะรับคำสั่ง sed เพื่อทำการเปลี่ยนแปลงถาวรกับไฟล์ได้อย่างไร?


32

เป็นไปได้ไหม ฉันอ่านบางที่คำสั่งต่อไปนี้จะทำ:

sed -e [คำสั่ง] [ไฟล์]

แต่ดูเหมือนว่าจะทำเช่นเดียวกับเพียง

sed [คำสั่ง] [ไฟล์]

(ไม่ได้บันทึกการเปลี่ยนแปลง) มีวิธีการทำเช่นนี้โดยใช้ sed หรือไม่


2
-eธงยืนสำหรับการแสดงออก คุณอาจต้องการ-iธงซึ่งหมายความว่าin-placeและฉันขอแนะนำให้คุณใช้ sed -i.bak 's/../' filename
Valentin Bajrami

คำตอบ:


50

ฉันคิดว่าคุณกำลังมองหา-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การใช้งานที่แตกต่างกัน


4
โปรดทราบว่าหน้าคนนั้นผิด sedไม่ทำการแก้ไขในสถานที่ มันสร้างไฟล์ใหม่และเขียนทับไฟล์เก่าการเปลี่ยนแปลง inode
Marco

2
@Marco นั่นเป็นวิธีที่ปลอดภัยในการแก้ไขไฟล์ “ การแก้ไขไฟล์ในสถานที่” ในเอกสารประกอบ sed หมายความว่าไฟล์ต้นฉบับ (ตามที่กำหนดโดยชื่อไฟล์) ได้รับการแก้ไขไม่ใช่ไฟล์ต้นฉบับ (ตามที่กำหนดโดย inode) ได้รับการแก้ไข
Gilles 'หยุดชั่วร้าย'

2
@Gilles ฉันทั้งหมดเห็นว่านี่เป็นวิธีที่ต้องการแก้ไขไฟล์ แต่ฉันแทบจะไม่ต้องการเรียกมันในสถานที่ แต่นั่นทำให้เดือดร้อนกับคำถามของวิธีการระบุไฟล์โดย inode หรือตามชื่อ ฉันจะพูดโดย inode มิฉะนั้นโครงสร้างเช่น{ rm file; cmd > file; } < fileจะนำไปสู่ข้อสรุปที่ cmd อ่านและเขียนไฟล์เดียวกันซึ่งมันไม่ได้ มันเป็นไฟล์ distince สองไฟล์ที่เพิ่งมีชื่อเหมือนกัน แต่ฉันไม่ต้องการเริ่มการสนทนาที่นี่
Marco

บน MacOS 10.14 ฉันจะได้รับเมื่อทำงาน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ทำงานได้ดี มีแนวคิดใดที่จะทำให้มันทำงานได้โดยไม่ต้องสร้างไฟล์สำรอง?
Joshua Pinter

1
โอเคคิดออกแล้ว ใน macOS คุณต้องเพิ่มสตริงว่างสำหรับตัวเลือกพารามิเตอร์ส่วนขยายอย่างชัดเจน:sed -i '' 's/o/X/g' foo.txt
Joshua Pinter

2

โซลูชันเหล่านี้ใช้งานได้กับ 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


คุณไม่สามารถใช้ tee askubuntu.com/a/752451
Steven Penny

1

-eตัวเลือกสำหรับการดำเนินการหลายsedคำสั่ง

sed -e 's/linux/unix/' -e 's/os/OS/' file.txt

พิจารณาfile.txtเป็น

linux os

ดังนั้น O / P คือ

unix os

-i ตัวเลือกบันทึกการเปลี่ยนแปลงอย่างถาวร ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.