วัตถุประสงค์ของ -e ในคำสั่ง sed คืออะไร?


41

ฉันไม่สามารถหาเอกสารใด ๆ เกี่ยวกับsed -eสวิทช์สำหรับการเปลี่ยนแบบง่ายฉันต้องการมันหรือไม่?

เช่น

sed 's/foo/bar/'

VS

sed -e 's/foo/bar/'

14
คุณแน่ใจว่าคุณไม่พบในครั้งนี้man sed?

4
คุณไม่พบคำอธิบาย potongs ทำไมไม่ใช้ "cmd1; cmd2"
ไม่ทราบผู้ใช้

คำตอบ:


28

จากหน้าคน:

-e script, --expression=script

    add the script to the commands to be executed

ดังนั้นคุณสามารถใช้หลาย-eตัวเลือกเพื่อสร้างสคริปต์จากหลายส่วน

$ sed -e "s/foo/bar/" -e "/FOO/d"

ครั้งแรกที่จะเข้ามาแทนที่fooด้วยแล้วลบบรรทัดที่มีทุกbarFOO


3
ดังนั้นคุณไม่จำเป็นต้อง '-e' ถ้าคุณมีเพียงสคริปต์เดียวใช่ไหม
JohnyTex

ฉันเองก็กำลังค้นหาจุดประสงค์ที่แท้จริงของ-e
typelogic

27

สิ่งนี้อาจใช้ได้กับคุณ:

sed -e '/foo/i\' -e 'bar' -e '/fred/a\' -e 'barny' -e '/harry/c\' -e 'potter' file

ในแต่ละกรณีคำสั่งi(แทรก) a(ต่อท้าย) และc(เปลี่ยน) จะต้องถูกยกเลิกโดยบรรทัดใหม่

โดยปกติคำสั่งสามารถคั่นด้วย;เช่น/foo/d;/bar/dและจัดกลุ่มโดย{...} เช่น/foo/{h;d}แต่สำหรับi,a,cคำสั่งที่-eให้วิธีการแยกคำสั่ง

ทางเลือกคือใช้เชลล์ (ทุบตี) เพื่อแทรกบรรทัดใหม่:

sed '/foo/i\bar'$'\n''/fred/a\barney'$'\n''/harry/c\potter' file

1
อย่างน้อยการใช้งาน sed บางอย่าง (เช่นบน FreeBSD) คุณต้องสิ้นสุดเลเบลและคำสั่งสาขาโดยใช้บรรทัดใหม่ / -eแทนที่จะใช้เซมิโคลอน สิ่งนี้จะไม่ทำงาน: sed ':a; /x/ { s/x/y/g; ba }; q' <<< "jxm". แต่จะ:sed -e ':a' -e '/x/ { s/x/y/g; ba' -e '}; q' <<< "jxm"
dubiousjim

ฉันไม่แน่ใจว่าmust be terminated with a newlineวลีนี้มีความจำเป็นอย่างไร เมื่อผมทดสอบที่นี่ในของฉันงานนี้:cygwin sed '/foo/i\bar' fileดังนั้นขณะนี้ที่เราสามารถหลอมรวมเข้าด้วยกันการแสดงออกที่แยกจากกันเป็นหนึ่งนี้ทำให้เกิดอีกครั้งเพื่อคำถามเดิม: อะไรคือจุดประสงค์ที่แท้จริงของอะไร-e?
typelogic

1

-eเพื่อเทียบเท่า--expressionเป็นตัวเลือกจนกว่าคุณจะได้คบแสดงออกหลายแห่งด้วยกัน (ไม่ธรรมดา) ดังแสดงในอีกคำตอบ

Aside: ;สามารถใช้แทนในนิพจน์เดียวกันเพื่อดำเนินการหลายนิพจน์ได้


0

ในความช่วยเหลือสำหรับsedคุณจะพบว่า-eธงย่อมาจาก:

 -e script, --expression=script
                 add the script to the commands to be executed

-eแต่คุณไม่ได้เป็นคนแรกที่จะสับสนหลังจากเผชิญหน้า ในตัวอย่างของคุณsed 's/foo/bar/'และsed -e 's/foo/bar/'เทียบเท่า ในทั้งสองกรณีs/foo/bar/เป็นสคริปต์ที่ดำเนินการโดย sed ตัวเลือกที่สองนั้นชัดเจนยิ่งขึ้น แต่นั่นอาจไม่ใช่เหตุผลที่คุณมักจะเห็นการ-eใช้งาน เหตุผลก็คือว่าทำให้มันเป็นไปได้ที่จะใช้มากกว่าหนึ่งสคริปต์ด้วยการภาวนาเดียวกันของ-e sedคำถามนี้ยังคงมีอยู่ว่าทำไมถึงใช้ถ้าคุณใช้เพียงสคริปต์เดียว ตัวอย่างต่อไปนี้อาจอธิบายได้ว่า:

echo "foo" | sed -e 's/foo/bar/' -e 's/bar/foo'

จะส่งออก "foo"

อย่างไรก็ตาม

echo "foo" | sed 's/foo/bar/' -e 's/bar/foo'

จะล้มเหลวเพราะตอนนี้sedตีความชื่อแรกs/foo/barเป็นชื่อไฟล์ ดังนั้นเพื่อให้ชีวิตง่ายขึ้นสำหรับคุณในอนาคตคุณสามารถเริ่มใช้-eธงได้แล้ววันนี้ -e <script>ว่าในอนาคตทางคุณก็สามารถผนวกคำสั่งด้วยสคริปต์พิเศษโดยใช้

หมายเหตุในคำตอบอื่น ๆ ที่ใช้;เป็นทางเลือกในการใช้หลายสคริปต์ได้รับการแนะนำ แม้ว่าจะเป็นไปได้ในทางเทคนิคในบางกรณี แต่ก็ไม่ได้รับการสนับสนุนเพราะมันนำไปสู่การอ่านรหัสที่ยากมาก ดูตัวอย่างได้ที่นี่: https://www.grymoire.com/Unix/Sed.html#uh-61

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