Những gì bạn đã làm là xóa SUBSTITUTETHISbất cứ nơi nào nó xuất hiện trong tệp (nhưng không phải phần còn lại của dòng nơi nó xuất hiện) và chèn nội dung temp.TXTbên dưới dòng đó. Nếu SUBSTITUTETHISxuất hiện nhiều lần trên một dòng, chỉ có lần xuất hiện đầu tiên được xóa và chỉ một bản sao temp.TXTđược thêm vào.
Nếu bạn muốn thay thế toàn bộ dòng khi SUBSTITUTETHISxuất hiện, sử dụng dlệnh. Vì bạn cần chạy cả hai rvà dkhi có trận đấu, hãy xếp chúng vào một nhóm giằng.
sed -e '/SUBSTITUTETHIS/ {' -e 'r temp.TXT' -e 'd' -e '}' -i devel.txt
Một số triển khai sed cho phép bạn sử dụng dấu chấm phẩy để phân tách các lệnh và bỏ qua các dấu phân cách hoàn toàn xung quanh dấu ngoặc, nhưng bạn vẫn cần một dòng mới để chấm dứt đối số cho rlệnh:
sed -e '/SUBSTITUTETHIS/ {r temp.TXT
d}' -i devel.txt
Nếu bạn muốn thay thế SUBSTITUTETHISbằng nội dung của tệp, nhưng giữ lại những gì đến trước và sau nó trên dòng, thì phức tạp hơn. Phương pháp đơn giản nhất là bao gồm nội dung của tệp trong lệnh sed; lưu ý rằng bạn sẽ phải trích dẫn chính xác nội dung của nó.
sed -e "s/SUBSTITUTETHIS/$(<temp.TXT sed -e 's/[\&/]/\\&/g' -e 's/$/\\n/' | tr -d '\n')/g" -i devel.txt
Hoặc sử dụng Perl. Đây là ngắn nhưng chạy catmột lần cho mỗi thay thế:
perl -pe 's/SUBSTITUTETHIS/`cat temp.TXT`/ge' -i devel.txt
Để đọc tệp một lần khi tập lệnh bắt đầu và tránh phụ thuộc vào lệnh shell:
perl -MFile::Slurp -pe 'BEGIN {$r = read_file("temp.TXT"); chomp($r)}
s/SUBSTITUTETHIS/$r/ge' -i devel.txt
(được trình bày trên hai dòng để dễ đọc nhưng bạn có thể bỏ qua ngắt dòng). Nếu tên tệp là biến, để tránh trích dẫn các vấn đề, hãy chuyển nó đến tập lệnh thông qua biến môi trường:
replacement_file=temp.TXT perl -MFile::Slurp -pe 'BEGIN {$r = read_file($replacement_file); chomp($r)}
s/SUBSTITUTETHIS/$r/ge' -i devel.txt