У меня есть текстовый файл ( devel.xml
).
Я добавил слово REPLACETHIS, чтобы заменить эту строку содержимым другого файла ( temp.txt
).
Самое близкое, что у меня есть, это:
sed -i -e "/REPLACETHIS/r temp.TXT" -e "s///" devel.txt;
Это вставляет содержимое после строки, а затем удаляет строку после.
Это лучший способ сделать это?
text-processing
sed
perl
RafaelGP
источник
источник
Ответы:
То, что вы сделали, это удалите все,
SUBSTITUTETHIS
что появляется в файле (но не остальную часть строки, где он появляется), и вставьте содержимоеtemp.TXT
ниже этой строки. ЕслиSUBSTITUTETHIS
в строке появляется несколько раз, удаляется только первое вхождение иtemp.TXT
добавляется только одна копия .Если вы хотите заменить всю строку при
SUBSTITUTETHIS
появлении, используйтеd
команду. Так как вам нужно запустить оба,r
иd
когда есть совпадение, поместите их в группу в скобках.Некоторые реализации sed позволяют вам использовать точки с запятой для разделения команд и вообще не использовать разделители вокруг фигурных скобок, но вам все еще нужен символ новой строки для завершения аргумента
r
команды:Если вы хотите заменить
SUBSTITUTETHIS
содержимым файла, но сохранить то, что находится до и после него в строке, это более сложно. Самый простой способ - включить содержимое файла в команду sed; обратите внимание, что вам придется правильно цитировать его содержимое.Или используйте Perl. Это коротко, но выполняется
cat
один раз для каждой замены:Чтобы прочитать файл один раз при запуске сценария и избежать зависимости от команды оболочки:
(представлен на две строки для удобства чтения, но вы можете опустить разрыв строки). Если имя файла является переменным, чтобы избежать проблем с кавычками, передайте его сценарию через переменную среды:
источник
cat temp.txt
меня можно было это сделатьcat ${variable}
?-0777
переключателя для slurp во всем файле и обычногоopen
:perl -0777 -pe 'BEGIN {open F, q(temp.TXT); $r=<F>; chomp($r)} s/SUBSTITUTETHIS/$r/ge' -i devel.txt
r temp.TXT
переносить сообщения типа «BEGIN temp.TXT», «END temp.TXX»a
(добавить) команду. grymoire.com/Unix/Sed.html#uh-36