Những gì bạn đã làm là xóa SUBSTITUTETHIS
bấ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.TXT
bên dưới dòng đó. Nếu SUBSTITUTETHIS
xuấ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 SUBSTITUTETHIS
xuất hiện, sử dụng d
lệnh. Vì bạn cần chạy cả hai r
và d
khi 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 r
lệnh:
sed -e '/SUBSTITUTETHIS/ {r temp.TXT
d}' -i devel.txt
Nếu bạn muốn thay thế SUBSTITUTETHIS
bằ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 cat
mộ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