sed load substitute из файла

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

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

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

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

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

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

  • Как пропустить файл в sed, если он содержит регулярное выражение?
  • найти и заменить sed с помощью косой черты в поиске и замене строки
  • Почему я не могу избежать брекетов "]" в sed?
  • SED переключающие столбцы в одном файле, ограниченном,
  • Замените произвольные символы в середине строки IP-адреса с помощью sed
  • awk, чтобы вырезать часть поля и все еще печатать всю строку
  • Манипулировать некоторые данные с ограниченным разделением в полезный CSV
  • Как печатать текст между первым вступлением пары строк?
  • 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 
    Interesting Posts

    разрешения доступа различаются для одного и того же файла на основе программы

    Переименуйте имя хоста RedHat7 без перезагрузки

    Что именно происходит, когда я запускаю `netctl-auto enable-all`?

    Запуск vim на удаленной машине Linux «замерзает» OS X SSH-соединение

    CentOS – установить с помощью yum Apache 2.4

    Почему мое графическое устройство R не освежает и получает так медленно через VNC?

    Ошибка при записи DVD

    Игнорировать данный подкаталог в каждом каталоге при синхронизации с унисон

    Как сбрасывать SSHD-процесс и искать строки

    Скопировать несколько файлов в один каталог с параллельным

    Как обновить настройки пользователя / группы запущенного процесса?

    Предоставляет доступ пользователю root в течение определенного периода времени

    dkms против модуля-помощника

    Сценарий должен создавать новый файл каждый день с тем же именем, перед его созданием он должен переименовать файл предыдущего дня с отметкой времени времени

    Почему я не могу изменить разрешение на символическую ссылку на Mac?

    Linux и Unix - лучшая ОС в мире.