Отвечать

Отвечать

У меня есть файл, скажем 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: проверьте в тестовой папке, работает ли это!

Объяснение

По сути:

  1. Файл cat map.txt.
  2. Прочитайте каждую строку и найдите слово, которое нужно заменить, $oldwи замену $neww.
  3. Для каждой пары выполните команду 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

Связанный контент