ฉันไม่สามารถหาเอกสารใด ๆ เกี่ยวกับsed -eสวิทช์สำหรับการเปลี่ยนแบบง่ายฉันต้องการมันหรือไม่?
เช่น
sed 's/foo/bar/'
VS
sed -e 's/foo/bar/'
ฉันไม่สามารถหาเอกสารใด ๆ เกี่ยวกับsed -eสวิทช์สำหรับการเปลี่ยนแบบง่ายฉันต้องการมันหรือไม่?
เช่น
sed 's/foo/bar/'
VS
sed -e 's/foo/bar/'
คำตอบ:
จากหน้าคน:
-e script, --expression=script
add the script to the commands to be executed
ดังนั้นคุณสามารถใช้หลาย-eตัวเลือกเพื่อสร้างสคริปต์จากหลายส่วน
$ sed -e "s/foo/bar/" -e "/FOO/d"
ครั้งแรกที่จะเข้ามาแทนที่fooด้วยแล้วลบบรรทัดที่มีทุกbarFOO
-e
สิ่งนี้อาจใช้ได้กับคุณ:
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
-eแทนที่จะใช้เซมิโคลอน สิ่งนี้จะไม่ทำงาน: sed ':a; /x/ { s/x/y/g; ba }; q' <<< "jxm". แต่จะ:sed -e ':a' -e '/x/ { s/x/y/g; ba' -e '}; q' <<< "jxm"
must be terminated with a newlineวลีนี้มีความจำเป็นอย่างไร เมื่อผมทดสอบที่นี่ในของฉันงานนี้:cygwin sed '/foo/i\bar' fileดังนั้นขณะนี้ที่เราสามารถหลอมรวมเข้าด้วยกันการแสดงออกที่แยกจากกันเป็นหนึ่งนี้ทำให้เกิดอีกครั้งเพื่อคำถามเดิม: อะไรคือจุดประสงค์ที่แท้จริงของอะไร-e?
ในความช่วยเหลือสำหรับ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
man sed?