У меня есть файл, скажем map.txt
, содержащий список строк поиска и соответствующих замен:
search -> replacement
bigBone -> bb
fishMarket -> fm
dogCollar -> dc
...
Мне нужно выполнить поиск и замену всех строк, соответствующих вышеприведенному, для всех файлов рекурсивно в папке, за исключением символических ссылок. Я знаю, как это сделать по одному, например так:
$ find /some/folder -type f -exec sed -i 's/old_text/new_text/g' {} \;
Как я могу выполнить это в массовом масштабе, используя приведенное выше отображение? Я прочиталэтот вопрос, но не совсем понял.
решение1
Отвечать
Если вас не волнует скорость (это разовая задача), то, возможно, вы можете попробовать это:
cat map.txt | while read line; do
neww=${line##* };
oldw=${line%% *};
find /some/folder -type f -exec sed -i "s/$oldw/$neww/g" {} \;
done
Не оптимально, я знаю... :-P
PS: проверьте в тестовой папке, работает ли это!
Объяснение
По сути:
- Файл cat map.txt.
- Прочитайте каждую строку и найдите слово, которое нужно заменить,
$oldw
и замену$neww
. - Для каждой пары выполните команду find, которую вы уже использовали (на этот раз обратите внимание на двойные кавычки, чтобы разрешить подстановку переменных).
О расширении параметров
Чтобы задать переменные $oldw
, $neww
нам нужно получить первое и последнее слово каждой строки. Для этого мы используем расширение параметра (чистая реализация Bash), хотя мы могли бы использовать и другие способы получения первого и последнего слова строки (например, cut
или awk
).
${line##* }
: из переменнойline
, удалить наибольший префикс (двойной#
) шаблон, где шаблон - это любые символы (*
), за которыми следует пробел (). Таким образом, мы получаем последнее слово в
line
.${line%% *}
: из переменнойline
, удалить наибольший суффикс (двойной%
) шаблон, где шаблон - это пробел (), за которым следуют любые символы (
*
). Таким образом, мы получаем первое слово вline
.
В данном случае слова были разделены пробелом, но мы могли бы использовать любой разделитель.
решение2
Иногда мне нужно искать и заменять термины в файлах конфигурации.
Я написал скрипт, доступный на githubsandr - поиск и заменачто позволяет создавать/использовать карту и выполнять замену в файлах.
Пример использования:
$ cat file
Voyez ce jeu exquis wallon, de graphie 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 cause ambiguë entendue à Moÿ, dans un capharnaüm qui, pense-t-il, diminue çà et là 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, de graphie 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 cauSE ambiguë entendue à Moÿ, dans un capharnaüm qui, penSE-t-il, diminue çà et là la qualité de son œuvre. Prouvez, BEAU j