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

У меня есть текстовый файл ( 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 
  • Найти и заменить строки в текстовом файле на выходе из другого файла
  • Как я могу эффективно выбирать конкретные номера строк из списка записей?
  • Переименуйте имена файлов MP3 в шаблон
  • Скопируйте текстовые строки из файла и добавьте их в один и тот же файл с префиксом средней линии или удалите префикс средней строки
  • использование sed / awk в переменных сценария bash
  • Дата изменения «29 июля 2011 года» на «20110729»
  • Как сообщить «sed» на месте изменения
  • удаление расширений в столбце
  • подсчеты совпадений и несоответствий
  • Rsync, cp или любая утилита добавляют специальные отфильтрованные данные из исходного файла в анализируемый файл
  • Файлы Cat 2 и избегайте дублирования строк
  • Linux и Unix - лучшая ОС в мире.