Те, що ви зробили, - це видалити, SUBSTITUTETHIS
де б він не з’явився у файлі (але не решту рядка, де він з’явився) і вставити вміст temp.TXT
нижче цього рядка. Якщо SUBSTITUTETHIS
на рядку відображається кілька разів, видаляється лише перше явище, і temp.TXT
додається лише одна копія .
Якщо ви хочете замінити весь рядок, коли SUBSTITUTETHIS
з'явиться, скористайтеся d
командою. Оскільки вам потрібно запустити і те, r
і інше, d
коли є відповідність, поставте їх у групу, встановлену фігурами.
sed -e '/SUBSTITUTETHIS/ {' -e 'r temp.TXT' -e 'd' -e '}' -i devel.txt
Деякі реалізації sed дозволяють використовувати крапки з комою для розділення команд та пропуску роздільників взагалі навколо дужок, але для завершення аргументу в 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