เขียนคำสั่ง sed ใหม่เพื่อแก้ไขสตรีมแทนไฟล์

ในกรณีปกติ sed สามารถแก้ไขสตรีมจากคำสั่งอื่นได้ง่ายๆ โดยการไพพ์:

./somecommand | sed 's/xx/yy/g'

อย่างไรก็ตาม คำสั่ง sed ที่ฉันใช้นั้นซับซ้อนเล็กน้อย ก่อนหน้านี้ ฉันได้รับความช่วยเหลือในการเพิ่มประสิทธิภาพ sed สำหรับกรณีการใช้งานเฉพาะ: เพิ่มประสิทธิภาพเชลล์สคริปต์ สำหรับการเปลี่ยน sed หลายรายการ

ผลลัพธ์สุดท้ายคือสำหรับกรณีการใช้งานของฉัน คำสั่ง sed ต่อไปนี้เหมาะสมที่สุด:

./somecommand > file
sed -e 's/^/s|/; s/$/|g/;' replacement_list | sed -r -f - -i file

โดยพื้นฐานแล้ว คำสั่ง sed แรกจะสร้างรายการการดำเนินการ sed จากไฟล์ที่มีการแทนที่คู่กัน คำสั่ง sed ที่สองจะใช้สตรีมผ่านการวางท่อ และใช้ตัวเลือก -f เพื่อประมวลผลไฟล์

สิ่งต่าง ๆ เปลี่ยนไปเล็กน้อยตั้งแต่นั้นมา และตอนนี้ฉันจัดการเพื่อให้ somecommand แสดงผลผลลัพธ์เป็น stdout แทนที่จะเขียนลงไฟล์ แต่ฉันไม่สามารถคิดวิธีเขียนชุดคำสั่งข้างต้นใหม่ได้อย่างถูกต้อง ส่วนหนึ่งของความยากคือคำสั่ง sed ที่สองใช้สตรีมจากคำสั่ง sed แรกอยู่แล้ว

สิ่งหนึ่งที่ฉันได้ลองคือกำหนด stdout ของ somecommand ให้กับตัวแปรและพยายาม <<< ลงในคำสั่ง sed ที่สอง อย่างไรก็ตามนั่นไม่ได้ผล


person Reuben L.    schedule 18.09.2014    source แหล่งที่มา


คำตอบ (1)


คุณสามารถแก้ไขสิ่งนี้ได้โดยใช้การขยายเชลล์แบบอินไลน์ (ฉันคิดว่านั่นคือสิ่งที่เรียกว่า แก้ไขให้ถูกต้องหากฉันผิด)

./somecommand | sed -r -e "`sed -e 's/^/s|/; s/$/|g/;' replacement_list`"

สังเกต backticks ภายในเครื่องหมายคำพูดคู่ ซึ่งจะทำให้ stdout ของคำสั่ง sed ภายในถูกวางไว้ภายในเครื่องหมายคำพูดคู่

แม้ว่านี่จะเป็นอันตราย ดังนั้นคุณอาจต้องการลองบันทึกเอาต์พุตของคำสั่งภายใน sed ลงในตัวแปรเชลล์ก่อนเช่นนี้

sedcommand="`sed -e 's/^/s|/; s/$/|g/;' replacement_list`"
./somecommand | sed -r -e "$sedcommand"
person randomusername    schedule 18.09.2014
comment
./somecommand | sed -r -e "$( sed -e 's/^/s|/; s/$/|g/;' replacement_list )" ไม่จำเป็นต้องมีการหลีกภายในเครื่องหมายคำพูดคู่อีกต่อไป หรือใช้เครื่องหมายคำพูดคู่แทนการใช้เครื่องหมายคำพูดแบบธรรมดาหรือเครื่องหมายแบ็กสแลชที่เกิดขึ้นหลายครั้ง เช่น s/\\\\/\\\\\\\\/g - person NeronLeVelu; 19.09.2014