Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

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

shell
Теги: #<Tag:0x00007f7b6263b2f0>

#1

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

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


(Sergey Korol) #2

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


#3

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

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

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


(ex3me0) #4

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


(rmerkushin) #5

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

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


#6

http://vasir.net/blog/ubuntu/replace_string_in_multiple_files - 90% тем которые находил пишут использовать sed, но все что я не пробовал выкидывало ошибки, по одному файлу заменяет а когда все файлы в папке выдавало ошибку. Еще поищу варианты и попытаюсь сформулировать более конкретно вопрос.


(Pavel Ordenko) #7

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


#8

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


(Pavel Ordenko) #9

Конечно не выполняется, программа 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


#10

Может я пропустил что-то но он тоже не выполняется, выдает ошибки “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

(Pavel Ordenko) #11

Только что проверил Ваш вариант у себя - все работает (правда, возможно исходные данные различаются, я то не в курсе, что у Вас в файлах). Судя по пути после 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


#12

Большое всем спасибо за помощь!
Последний вариант сработал, еще как альтернатива нашел хороший вариант на пайтоне - http://stackoverflow.com/questions/4205854/python-way-to-recursively-find-and-replace-string-in-text-files/6257321#6257321