sed load substitute из файла

Я пытаюсь заменить шаблон в файле полным содержимым другого файла с помощью sed.

В настоящее время я использую:

sed "s/PATTERN/`cat replacement.txt`/g" "openfile.txt" > "output.txt" 

Однако, если файл замены содержит любые символы, такие как ' , " , или / я начинаю получать ошибки из-за того, что вход не подвергается санитарной обработке.

Я пытался использовать это руководство, чтобы помочь мне, но мне очень трудно следовать. Если я попробую предложенную команду r file , я просто вернусь к строке.

Каков наилучший способ приблизиться к этому?

  • Удалить строку между двумя шаблонами регулярных выражений
  • Как происходит модификация файла inplace в файле?
  • лучший язык программирования для интенсивных задач ввода / вывода
  • Удалить несколько регулярных выражений из переменной с помощью sed
  • ksh / bash Форматирование файлов через sed по файлу cat | команда sed
  • Подготовить x / к строке, где x - переменная на каждой строке
  • Сортировка слов в каждой строке, редактирование файла на месте
  • Как использовать инструменты GNU для извлечения и объединения двух подстрок одной и той же строки?
  • 4 Solutions collect form web for “sed load substitute из файла”

    Это должно сработать для вас. Я не голосовал, чтобы закрыть как дубликат, так как вы указали, что у вас есть символы ' , / и " в вашем файле. Итак, я провел тестирование, как показано ниже.

    У меня есть file1 как file1 ниже.

     cat file1 ramesh' has " and / in this file and trying "to replace' the contents in /other file. 

    Теперь file2 выглядит следующим образом.

     cat file2 This is file2 PATTERN After pattern contents go here. 

    По общей ссылке я создал script.sed как script.sed ниже.

     cat script.sed /PATTERN/ { r file1 d } 

    Теперь, когда я запускаю команду как sed -f script.sed file2 , я получаю вывод как,

     This is file2 ramesh' has " and / in this file and trying "to replace' the contents in /other file. After pattern contents go here. 

    EDIT : Это хорошо работает с несколькими шаблонами в файле.

    Если вам нужно решение awk , вы можете использовать что-то вроде ниже.

      awk '/PATTERN/{system("cat file1");next}1' file2 

    тестирование

     cat file1 ramesh' has " and / in this file and trying "to replace' the contents in /other file. 

    Теперь у меня есть file2 как file2 ниже.

     cat file2 This is file2 PATTERN After pattern contents go here. PATTERN 

    Теперь я использую вышеупомянутую команду awk .

    Вывод:

     This is file2 ramesh' has " and / in this file and trying "to replace' the contents in /other file. After pattern contents go here. ramesh' has " and / in this file and trying "to replace' the contents in /other file. 

    Рекомендации

    http://www.unix.com/shell-programming-and-scripting/158315-replace-string-contents-txt-file-containing-multiple-lines-strings.html

    В:

     sed "s/PATTERN/`cat replacement.txt`/g" "openfile.txt" 

    ' и " не должно быть проблемой. Те, которые не являются особыми для sed . В чем проблема: & , \ , / и newline. Вы можете избежать тех, у кого есть другая команда sed :

     sed "s/PATTERN/$(sed 's@[/\&]@\\&@g;$!s/$/\\/' replacement.txt)/g" openfile.txt 

    Обратите внимание, что он удаляет завершающие символы новой строки в файле replacement.txt . Если вы этого не хотите, вы можете сделать

     replacement=$(sed 's@[/\&]@\\&@g;s/$/\\/' replacement.txt; echo .) replacement=${replacement%.} sed "s/PATTERN/$replacement/g" openfile.txt 

    С помощью GNU sed вы можете просто вырезать cat в любой точке сценария, который вам нравится. В отличие от r – который планирует выход для конца цикла линии (что может очень расстраивать!) , e работает как i или c , так как он сразу записывает свой вывод. Вот несколько примеров его использования:

     printf %s\\n 'these are some words' \ 'that will each appear' \ 'on their own line' | sed 's/.*words/echo & ; cat file/e' these are some words these are some more words that are stored in a file that will each appear on their own line 

    И вот как вы можете это использовать:

     printf %s\\n 'these are some words' \ 'that will each appear' \ 'on their own line' | sed 's/\(.*\)\n*words/\1\n&/;//P;s//\ncat file/ep;s/.*\n//' these are some these are some more words that are stored in a file that will each appear on their own line 
    Linux и Unix - лучшая ОС в мире.