То, что вы сделали, это удалите все, 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