Intereting Posts
Как написать сценарий bash для сообщения состояний машины и условного ping их? Подключите драйвер alauda к устройству mtd Замененный согласованный текст в Vim с рисунком Постоянная консоль на рабочем столе как «виджет» Оптимизирует ли размер для уменьшения использования памяти во время выполнения, а также двоичный размер? Разрешить ввод имени пользователя sddm (LDAP / Kerberos) Как выбрать одно направление прокрутки для сенсорной панели, а другое – для ThinkPad Nub? Что представляет собой Скраб «Проход»? Настройка обучения Linux Как я могу извлечь / изменить строки в текстовом файле, данные которого разделены на поля? Понимание команды копирования Как я могу передать позиционный параметр, сценарий bash требует, чтобы он был недоступен? SFTP Chroot и SSH Возможно ли монтировать файл с разными правами собственности / разрешениями? Фильтрация изображений в соответствии с именем файла, почему?

Как заменить строку в файле другим файлом?

У меня есть несколько файлов, которые содержат строку. Эта строка должна быть заменена всем содержимым другого файла (который может быть многострочным). Как я могу это сделать?

Мне нужно что-то вроде sed -i 's/string/filename/' * где filename является фактическим файлом, а не строкой «filename».

Дополнительная информация: Файл может содержать специальные символы, такие как / или \ или | или [ или ] .

bash хорошо работает для этого:

 $ cat replace foo/bar\baz the second line $ cat file the replacement string goes >>here<< $ repl=$(<replace) $ str="here" $ while IFS= read -r line; do echo "${line//$str/$repl}" done < file 
 the replacement string goes >>foo/bar\baz the second line<< 

Awk будет работать, за исключением того, что он будет интерпретировать escape-обратные экраны (the \b в моем примере)

 $ awk -v string="here" -v replacement="$(<replace)" ' {gsub(string, replacement); print} ' file the replacement string goes >>foo/baaz the second line<< 

Вам нужна недоработанная команда sed r, которая читает файл:

 sed -i '/string/{r filename d}' 

Я предполагаю, что вы хотите заменить всю строку, иначе замените d на что-то подходящее.

Я получил это для работы:

 $ foo='baz' $ echo "foobarbaz" | sed "s/foo/${foo}/" bazbarbaz 

Сделав этот шаг дальше, ваша первая строка будет выглядеть примерно так:

 $ foo=`cat filename` 

Предполагается, что вы знаете имя файла до того, как вы достигнете линии, которую нужно заменить, конечно – если вы этого не сделаете, вы должны прочитать строку, получить имя файла, а затем выполнить чтение и замену.