sed load substitute из файла

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

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

  • найти и заменить строку в файле без использования временного файла с SED
  • Указание параметров командной строки, разделенных запятыми, на основе строк текстовых файлов
  • Как добавить другой префикс для каждой строки в grep-выходе?
  • Sed для редактирования заголовка с содержимым другого файла
  • Sed regex для переменного слова на Ubuntu 14
  • Sed / awk / perl: порядок реверсирования значений, разделенных запятыми, сохранение другого текста
  • sed "s/PATTERN/`cat replacement.txt`/g" "openfile.txt" > "output.txt" 

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

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

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

  • \ n печатает n вместо новой строки при использовании sed в MaxOSX
  • Найти текст между вкладкой (\ t) в качестве разделителя
  • Печать строк с нечетными номерами, печать строк с четными номерами
  • Рекурсивный поиск / замена, учет глубины каталога
  • Как удалить строку, если строка является единственной вещью на линии
  • UNIX - команда разбивать файл на несколько файлов со всеми строками для каждых 3 уникальных значений в столбце
  • 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 - лучшая ОС в мире.