shell скрипт который заменяет текст в файлах

Прошу помощи в решении задачи.
Нужно написать шел скрип который смог бы заменить слова с левой части на слова в правой части:

Automotive - Manufacturing
Banking - Finance and Insurance
Education - Educational Services

Около 20 слов-словосочетаний которые разбросаны по папкам-файлам(около 500 файлов) и имеют разные расширение:

QA_Automation/api_testing/test_cases/post_create_site.yml
QA_Automation/api_testing/test_cases/sub/create_site.yml

QA_Automation/RobotFramework/Selenium2LibraryExtended.py

QA_Automation/RobotFramework/sub/sub2/TC008.txt

Как сами пробовали решать?

Я не уверен что в правильном направлении рою, но вот есть команда

sed -i -e ‘s/Слово1/Слово2/g’ file.txt

Она отлично справляется, но как в нее передать все 20 слов нужных для поиска?
И как ее заставить переходить по всем файлам/подпапкам?

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

Ну так в чем проблема? Гуглите как делать циклы, как обходить директории и т.п.

P.S.: а вообще я бы посмотрел в сторону Python скриптов, там это делается проще и быстрее, да и Python есть почти во всех нормальных дистрибутивах Linux

Replace a String in Multiple Files in Linux Using Grep and Sed | Erik Hazzard - 90% тем которые находил пишут использовать sed, но все что я не пробовал выкидывало ошибки, по одному файлу заменяет а когда все файлы в папке выдавало ошибку. Еще поищу варианты и попытаюсь сформулировать более конкретно вопрос.

Попробуйте регулярку, типа
sed -i -r 's/(word1|word2)/replacementWord/g' file.txt
Хотя, для 20-ти слов будет не оень красиво смотреться :slight_smile:

Вот так оно и работает, но для одного файла, когда подставляю папку с файлами то не выполняется:
sed: myfolder/: No such file or directory

Конечно не выполняется, программа sed такого не поддерживает. Чтобы перебрать все файлы в папке, напишите bash-скрипт, ну например
#!/bin/bash for file in $(find /path/to/folder/with/files -name '*.*') do sed -i -r 's/(word1|word2)/replacementWord/g' $file done

Может я пропустил что-то но он тоже не выполняется, выдает ошибки “sed: RE error: illegal byte sequence”

> #!/bin/bash
> for file in $(find /Users/username/Desktop/temp/myfolder -name '*.*')
> do
> sed -i -r 's/Financial Services/Finance and Insurance/g' $file
> done

Только что проверил Ваш вариант у себя - все работает (правда, возможно исходные данные различаются, я то не в курсе, что у Вас в файлах). Судя по пути после find, у Вас OS X (или как там “яблочная” система нынче называется? MacOS обратно? :slight_smile: Я не сильно в теме. Сам юзаю Antergos - система по сути тот же Arch. В ней и проверял, собственно). Немного погуглив, нашел тред, например такой.
Попробуйте перед sed добавить LC_ALL=C, чтобы получилось как-то так
#!/bin/bash for file in $(find /path/to/folder -name '*.txt') do LC_ALL=C sed -i -r 's/Financial Services/Finance and Insurance/g' $file done
или добавьте экспорт этой переменной перед скриптом, например так
#!/bin/bash export LC_ALL=C for file in $(find /path/to/folder -name '*.txt') do sed -i -r 's/Financial Services/Finance and Insurance/g' $file done

1 лайк

Большое всем спасибо за помощь!
Последний вариант сработал, еще как альтернатива нашел хороший вариант на пайтоне - python - Recursively find and replace string in text files - Stack Overflow