Я бы конвертировал ваш файл changesDictionary.txt в сценарий sed, используя ... sed:
$ sed -e 's/^"\(.*\)" = "\(.*\)"$/s\/\1\/\2\/g/' \
changesDictionary.txt > changesDictionary.sed
Примечание , любые специальные символы для регулярных выражений или выражений sed в вашем словаре будут неверно интерпретироваться sed, поэтому ваш словарь может содержать только самые примитивные функции поиска и замены, или вы Вам нужно будет поддерживать файл sed с правильными выражениями. К сожалению, в sed нет простого способа либо отключить регулярное выражение и использовать только совпадение строк, либо процитировать ваши поиски и замены как «литералы».
С помощью полученного сценария sed используйте команды find и xargs, а не find -exec, чтобы как можно быстрее преобразовать файлы с помощью сценария sed, обрабатывая их более одного за раз. .
$ find somedir -type f -print0 \
| xargs -0 sed -i -f changesDictionary.sed
Примечание , опция -i
для sed редактирует файлы «на месте», поэтому обязательно делайте резервные копии для безопасности или используйте -i~
для создания тильд-резервных копий.
Последнее замечание , использование поиска и замен может иметь непредвиденные последствия. Будут ли у вас поиски, которые являются подстрока других поисков? Вот пример.
$ cat changesDictionary.txt
"fix" = "broken"
"fixThat" = "Fixed"
$ sed -e 's/^"\(.*\)" = "\(.*\)"$/s\/\1\/\2\/g/' changesDictionary.txt \
| tee changesDictionary.sed
s/fix/broken/g
s/fixThat/Fixed/g
$ mkdir subdir
$ echo fixThat > subdir/target.txt
$ find subdir -type f -name '*.txt' -print0 \
| xargs -0 sed -i -f changesDictionary.sed
$ cat subdir/target.txt
brokenThat
Должно ли "fixThat" стать "Fixed" или "brokenThat"? Заказ имеет значение для сценария sed. Точно так же поиск и замена могут быть найдены и заменены более одного раза - изменение «a» на «b», может быть позже изменено другим поиском и заменой с «b» на «c».
Возможно, вы уже рассмотрели оба этих вопроса, но я упоминаю об этом, потому что я пробовал то, что вы делали раньше, и не думал об этом. Я не знаю ничего, что просто делает правильную вещь для одновременного поиска и замены. Итак, вам нужно запрограммировать его на то, чтобы делать правильные вещи самостоятельно.