Intereting Posts
Продолжить команды оболочки после подключения к SSH Почему RHEL предлагает обновления для оборудования, которого у меня нет? linux / solaris + проверить дублирующий действительный IP-адрес из файла Какой из них более легкий и процессорный: LXC и UML Systemd: служба не перезапускается с параметром WatchdogSec Почему кто-то хочет запустить UserMode Linux (UML) Что случилось с этой командой sed? Gentoo Linux GPG правильно шифрует файл, прошедший через параметр, но при чтении со стандартного ввода выбрасывает «Несоответствующий ioctl для устройства» Iptables: защита Linux-системы путем ограничения всего трафика на один статический IP-адрес и loopback с использованием Iptables Изменить элементарное имя хоста os? используя GPS с Linux и выводить только определенные данные Как я могу найти фактический (dd) размер флеш-диска? mdadm RAID10 – изменение сломанного диска Получить сетевую активность xorg.conf, чтобы выбрать один из Intel и NVIDIA или использовать оба одновременно (не оптимизатор, разделенный на два графика)

Как искать и заменять строки, соответствующие списку заметок для нескольких файлов

У меня есть файл, скажем map.txt , содержащий список строк поиска и соответствующие замены:

 search -> replacement bigBone -> bb fishMarket -> fm dogCollar -> dc ... 

Мне нужно выполнить поиск и замену всех строк, соответствующих приведенному выше, для всех файлов рекурсивно в папке, кроме символических ссылок. Я знаю, как это сделать в одно время:

 $ find /some/folder -type f -exec sed -i 's/old_text/new_text/g' {} \; 

Как я могу выполнить это в массовом масштабе, используя приведенное выше сопоставление? Я прочитал этот вопрос , но не совсем понял.

Ответ

Если вас не беспокоит скорость (это одноразовая задача), возможно, вы могли бы попробовать это:

 cat map.txt | while read line; do neww=${line##* }; oldw=${line%% *}; find /some/folder -type f -exec sed -i "s/$oldw/$neww/g" {} \; done 

Не оптимально, я знаю … 😛

PS: проверьте тестовую папку, чтобы узнать, работает ли она!

объяснение

В основном:

  1. Файл cat map.txt.
  2. Прочитайте каждую строку и получите слово, которое нужно заменить $oldw и замену $neww .
  3. Для каждой пары выполните команду find, которую вы уже использовали (обратите внимание на двойные кавычки на этот раз, чтобы разрешить замену переменных).

О расширении параметра

Чтобы установить переменные $oldw и $neww мы должны получить первое и последнее слово каждой строки. Для этого мы используем расширение параметра (чистая реализация Bash), хотя мы могли бы использовать другие способы для получения первого и последнего слова строки (например, cut или awk ).

  • ${line##* } : из переменной line удалите наибольший префикс (double # ), где pattern – любые символы ( * ), за которым следует пробел ( ). Таким образом, мы получаем последнее слово в line .
  • ${line%% *} : из переменной line удалите самый большой шаблон суффикса (double % ), где pattern – это пробел ( ), за которыми следуют любые символы ( * ). Итак, мы получаем первое слово в line .

В этом случае слова были разделены пробелом, но мы могли бы использовать любой разделитель.

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

Я написал скрипт, доступный в github sandr – поиск и замену, который позволяет создавать / использовать карту и выполнять замену в файлах.

Пример использования:

 $ cat file
 Voyez ce jeu exquis wallon, графический en kit mais bref.  Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à côté de l'alcôve ovoïde, où les bûches se consument dans l'âtre, ce qui lui permet de penser à la cænogenèse de l'être dont il est question dans la вызвать ambiguë entendue à Moÿ, dans un capharnaüm qui, pense-t-il, diminue çà et la la qualité de son œuvre.  Prouvez, beau j
 $ cat map.txt 
 wallon => WALLON
 se => SE
 penser => PENSER
 beau => BEAU
 $ cat file |  ./sandr -a map.txt 
 Voyez ce jeu exquis WALLON, графический en kit mais bref.  Portez ce vieux whiskey au juge blond qui fume sur son île intérieure, à côté de l'alcôve ovoïde, où les bûches SE consument dans l'âtre, ce qui lui permet de PENSER à la cænogenèSE de l'être dont il est question dans la cauSE ambiguë entendue à Moÿ, dans un capharnaüm qui, penSE-t-il, diminue çà et la la qualité de son œuvre.  Prouvez, BEAU j