ว่าฉันมีไฟล์ข้อความเช่นนี้:
# custom content section
a
b
### BEGIN GENERATED CONTENT
c
d
### END GENERATED CONTENT
ฉันต้องการแทนที่ส่วนระหว่างGENERATED CONTENT
แท็กด้วยเนื้อหาของไฟล์อื่น
วิธีที่ง่ายที่สุดในการทำเช่นนี้คืออะไร?
ว่าฉันมีไฟล์ข้อความเช่นนี้:
# custom content section
a
b
### BEGIN GENERATED CONTENT
c
d
### END GENERATED CONTENT
ฉันต้องการแทนที่ส่วนระหว่างGENERATED CONTENT
แท็กด้วยเนื้อหาของไฟล์อื่น
วิธีที่ง่ายที่สุดในการทำเช่นนี้คืออะไร?
คำตอบ:
lead='^### BEGIN GENERATED CONTENT$'
tail='^### END GENERATED CONTENT$'
sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file
}; /$tail/p; d }" existing_file
r insert_file
คำสั่งจะต้องเป็นสิ่งสุดท้ายในสายของ โปรดทราบว่าไม่อนุญาตให้มีช่องว่างหรือความคิดเห็น รหัสได้รับการทดสอบโดยใช้ GNU sed
โดย--posix
เปิดใช้งานตัวเลือกและทำงานได้ตามที่คาดไว้ดังนั้นจึงควรทำงานกับPOSIX ที่เข้ากัน sed
ได้
output=$(sed -e "..." existing_file)
) จากนั้นทำการแทนที่เป็นครั้งที่สอง (เช่นecho "$output" > existing_file
) เนื่องจากการพยายามเปลี่ยนเส้นทางไปยังไฟล์ที่คุณกำลังอ่านจะทำให้การตัดทอนก่อนที่จะอ่านเนื้อหา
newContent=`cat new_file`
perl -0777 -i -pe "s/(### BEGIN GENERATED CONTENT\\n).*(\\n### END GENERATED CONTENT)/\$1$newContent\$2/s" existing_file
คำเตือน: นี่ไม่ใช่วิธีที่ง่ายที่สุดที่จะทำ (แก้ไข: ทุบตีทำงาน; POSIX grep ก็ใช้ได้เช่นกัน)
หากข้อความหลักอยู่ในไฟล์ "main" และเนื้อหาที่สร้างขึ้นอยู่ในไฟล์ "gen" คุณสามารถทำสิ่งต่อไปนี้:
#!/bin/bash
BEGIN_GEN=$(cat main | grep -n '### BEGIN GENERATED CONTENT' | sed 's/\(.*\):.*/\1/g')
END_GEN=$(cat main | grep -n '### END GENERATED CONTENT' | sed 's/\(.*\):.*/\1/g')
cat <(head -n $(expr $BEGIN_GEN - 1) main) gen <(tail -n +$(expr $END_GEN + 1) main) >temp
mv temp main
main
ให้เขียนล้างก่อนที่แมวจะอ่าน
ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF
r FILE2
บอกr !command
ให้คุณอ่านจากสคริปต์อื่น
sed
สามารถทำได้มากกว่าเพียงแค่s/.../...
!