Заменить шаблон в файле с содержимым другого файла

У меня есть текстовый файл ( devel.xml ).

Я добавил к нему слово REPLACETHIS, чтобы заменить эту строку содержимым в другом файле ( temp.txt ).

Самое близкое, что у меня есть, это:

 sed -i -e "/REPLACETHIS/r temp.TXT" -e "s///" devel.txt; 

Это вставляет содержимое после строки, а затем удаляет строку впоследствии.

Это лучший способ сделать это?

One Solution collect form web for “Заменить шаблон в файле с содержимым другого файла”

Вы сделали, чтобы удалить SUBSTITUTETHIS где бы он ни 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 
  • как я могу прокомментировать / в разделе в исходном коде с sed или awk
  • Чтобы удалить новые строки после пустой строки
  • не работает целая строка
  • Почему мое регулярное выражение не работает с помощью sed в сценарии bash на Mac OSX?
  • Напишите файл, имя которого соответствует строке в сценарии sed
  • Как перечислять только имена файлов, удаляющих каталоги и подкаталоги
  • Как удалить идентичные строки в одном файле из другого, используя sed?
  • Подстановка первого вхождения шаблона в строку, для всех строк в файле с sed
  • Смешанное прописное и строчное слово в слове
  • Подмена текста с помощью определенных полей в файле журнала.
  • Использовать sed для печати с первой строки до строки, содержащей последнее вхождение шаблона?
  • Linux и Unix - лучшая ОС в мире.