สิ่งที่คุณทำคือการลบSUBSTITUTETHIS
ที่ใดก็ตามที่ปรากฏในไฟล์ (แต่ไม่ใช่ส่วนที่เหลือของบรรทัดที่ปรากฏ) และแทรกเนื้อหาtemp.TXT
ด้านล่างของบรรทัดนั้น หากSUBSTITUTETHIS
ปรากฏขึ้นหลายครั้งในหนึ่งบรรทัดจะมีเพียงการเกิดขึ้นครั้งแรกเท่านั้นและtemp.TXT
จะมีการเพิ่มเพียงหนึ่งสำเนาเท่านั้น
หากคุณต้องการแทนที่ทั้งบรรทัดเมื่อSUBSTITUTETHIS
ปรากฏขึ้นให้ใช้d
คำสั่ง เนื่องจากคุณต้องเรียกใช้ทั้งสองr
และd
เมื่อมีการแข่งขันให้ใส่พวกเขาในกลุ่มที่ค้ำยัน
sed -e '/SUBSTITUTETHIS/ {' -e 'r temp.TXT' -e 'd' -e '}' -i devel.txt
การนำไปปฏิบัติบางอย่างทำให้คุณสามารถใช้เซมิโคลอนเพื่อแยกคำสั่งและละเว้นตัวคั่นโดยรอบการจัดฟัน แต่คุณยังต้องขึ้นบรรทัดใหม่เพื่อยุติการโต้แย้งr
คำสั่ง:
sed -e '/SUBSTITUTETHIS/ {r temp.TXT
d}' -i devel.txt
หากคุณต้องการแทนที่SUBSTITUTETHIS
ด้วยเนื้อหาของไฟล์ แต่เก็บสิ่งที่มาก่อนและหลังในบรรทัดมันมีความซับซ้อนมากขึ้น วิธีที่ง่ายที่สุดคือการรวมเนื้อหาของไฟล์ในคำสั่ง sed; โปรดทราบว่าคุณจะต้องอ้างเนื้อหาอย่างถูกต้อง
sed -e "s/SUBSTITUTETHIS/$(<temp.TXT sed -e 's/[\&/]/\\&/g' -e 's/$/\\n/' | tr -d '\n')/g" -i devel.txt
หรือใช้ Perl นี่สั้น แต่วิ่งcat
หนึ่งครั้งสำหรับการทดแทนแต่ละครั้ง:
perl -pe 's/SUBSTITUTETHIS/`cat temp.TXT`/ge' -i devel.txt
หากต้องการอ่านไฟล์หนึ่งครั้งเมื่อสคริปต์เริ่มต้นและหลีกเลี่ยงขึ้นอยู่กับคำสั่งเชลล์:
perl -MFile::Slurp -pe 'BEGIN {$r = read_file("temp.TXT"); chomp($r)}
s/SUBSTITUTETHIS/$r/ge' -i devel.txt
(นำเสนอในสองบรรทัดเพื่อให้อ่านได้ แต่คุณสามารถละเว้นการขึ้นบรรทัดใหม่ได้) หากชื่อไฟล์เป็นตัวแปรเพื่อหลีกเลี่ยงปัญหาในการอ้างอิงผ่านไปยังสคริปต์ผ่านตัวแปรสภาพแวดล้อม:
replacement_file=temp.TXT perl -MFile::Slurp -pe 'BEGIN {$r = read_file($replacement_file); chomp($r)}
s/SUBSTITUTETHIS/$r/ge' -i devel.txt