sed ด้วยการแสดงออกหลายสำหรับการโต้แย้งในสถานที่


24

ฉันพยายามแทนที่คำหลายคำในไฟล์โดยใช้ sed -i #expression1 #expression2

ไฟล์

Something  123 item1
Something  456 item2
Something  768 item3
Something  353 item4

เอาท์พุท (ที่ต้องการ)

anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

ลองลึกหนาบาง

ฉันจะได้รับผลลัพธ์ต่อไปนี้โดยใช้sed -i2 ครั้ง

 sed -i 's/Some/any/g' file
 sed -i 's/item/stuff/g' file

ฉันสามารถมีวิธีที่เป็นไปได้ในการทำให้สิ่งนี้เป็นคำสั่งแบบแทนที่เดียวได้ไหม

sed -i 's/Some/any/g' -i 's/item/stuff/g' file

เมื่อฉันลองโค้ดด้านบนมันใช้s/item/stuff/gเป็นไฟล์และลองทำมัน ..


หากไฟล์ของคุณคล้ายกับตัวอย่างด้านบน (เช่นพวกเขาทำตามรูปแบบเดียวกัน) คุณสามารถทำได้ด้วยการทดแทนเพียงครั้งเดียว:sed - i 's/Some\(.*\)item/any\1stuff/' file
don_crissti

คำตอบ:


26

ขึ้นอยู่กับรุ่นของsedระบบคุณที่คุณสามารถทำได้

sed -i 's/Some/any/; s/item/stuff/' file

คุณไม่จำเป็นต้องใช้gเครื่องหมายสแลชหลังสุดท้ายในsคำสั่งที่นี่เนื่องจากคุณทำการแทนที่เพียงหนึ่งครั้งต่อบรรทัด

อีกวิธีหนึ่งคือ:

sed -i -e 's/Some/any/' -e 's/item/stuff/' file

-iตัวเลือกที่บอกsedไปที่การแก้ไขไฟล์ในสถานที่; หากมีตัวละครทันทีหลังจาก-iนั้นsedทำการสำรองข้อมูลของไฟล์ต้นฉบับและใช้ตัวอักษรเหล่านั้นเป็นส่วนขยายของไฟล์สำรอง เช่น,

sed -i.bak 's/Some/any/; s/item/stuff/' file

หรือ

sed -i'.bak' 's/Some/any/; s/item/stuff/' file

จะปรับเปลี่ยนประหยัดไปที่เดิมfilefile.bak

แน่นอนว่าในระบบ Unix (หรือ Unix-like) เรามักใช้ '~' แทน '.bak' ดังนั้น

sed -i~ 's/Some/any/;s/item/stuff/' file

2
โปรดทราบว่าคุณกำลังอธิบายตัวแปร GNU ตัวแปร BSD (ในขณะที่ FreeBSD หรือ OS / X) ต้อง-iโต้แย้งสำหรับ ดังนั้นsed -i '' 's/a/b/;s/c/d/' fileหรือsed -i .back 's/a/b/;s/c/d/'หรือsed -i.back 's/a/b/;s/c/d/'มี อื่น ๆการใช้งานโดยทั่วไปจะไม่สนับสนุนsed -i
Stéphane Chazelas

ขอบคุณ @ StéphaneChazelasที่อธิบายอย่างชัดเจน และฉันเดาว่าฉันควรจะพูดให้ชัดเจนมากขึ้นว่าใน GNU sed ไม่มีช่องว่างระหว่าง-iและส่วนขยาย
PM 2Ring

sed -i 's/$username = "root"/$username = "newuser"/; s/$password = "password"/$password = "passwd"/; s/$dbname="handicraftstore"/$dbname="handicraft"' Web/database.phpผลลัพธ์ sed: -e expression #1, char 141: unterminated '
command`

@alhelal ขออภัยความเห็นไม่เหมาะที่จะถามคำถาม แต่อย่างไรก็ตามสุดท้ายของคุณคำสั่งจะหายไปเป็นครั้งสุดท้ายs /
PM 2Ring

@ PM2Ring เนื่องจากฉันไม่ได้สังเกตว่าฉันเดาว่ามันเกี่ยวข้องกับวิธีแก้ปัญหาของคุณ อย่างไรก็ตามขอขอบคุณ
alhelal


5

การแสดงออกหลายรายการโดยใช้หลาย-eตัวเลือก:

sed -i.bk -e 's/Some/any/g' -e 's/item/stuff/g' file

หรือคุณสามารถใช้เพียงหนึ่ง:

sed -i.bk -e 's/Some/any/g;s/item/stuff/g' file

คุณควรให้นามสกุลสำหรับไฟล์สำรองเนื่องจากเมื่อมีการใช้งานบางอย่างsedเช่นOSX sedไม่สามารถใช้งานกับส่วนขยายที่ว่างเปล่าได้ (คุณต้องใช้sed -i ''เพื่อแทนที่ไฟล์ต้นฉบับ)


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