Linux. Заменить текст файла на текст из второго файла

Входной файл содержит произвольный текст. Во втором файле содержатся замены слов (2 колонки: 1 - что, 2 - на что меняем). Используя утилиты awk и sed произвести замены, соответствующие второму файлу в первом.

Хорошая задача, но ума не приложу как сделать, прошу помощи


Ответы (1 шт):

Автор решения: aleksandr barakin

раз примеров не приведено, будем исходить из предположения, что «поля» во втором файле разделены символом табуляции. тогда вся конструкция может выглядеть примерно так:

$ sed -f <(sed -r 's/#/\\#/g;s/([^\t]+)\t(.*)/s#\1#\2#g/' файл2) файл1

на таких исходных данных:

$ cat файл1
это исходный текст
$ cat файл2
это #то
текст   пример для подражания

получим:

#то исходный пример для подражания

пояснения:

  • sed -f файл-с-командами входной-файл — прочитать команды для программы sed из файла и применить их к входному файлу

  • <(программа) — это process substitution (не входит в стандарт posix, реализовано в ksh и его последователях)

  • sed -r 's/#/\\#/g;s/([^\t]+)\t(.*)/s#\1#\2#g/' входной-файл — преобразует входной файл в набор команд для программы sed. сначала добавляет обратный слэш перед символом # (чтобы его можно было использовать как разделитель аргументов в команде s), затем два «поля», разделённые символом табуляции, подставляет как первый и второй аргументы команды s. на текущем файл2 результат будет таким:

    $ sed -r 's/#/\\#/g;s/([^\t]+)\t(.*)/s#\1#\2#g/' файл2
    s#это#\#то#g
    s#текст#пример для подражания#g
    
→ Ссылка