ฉันไม่สามารถหาเอกสารใด ๆ เกี่ยวกับ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
ด้วยแล้วลบบรรทัดที่มีทุกbar
FOO
-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
?