Сценарий оболочки для поиска и замены строки - PullRequest
1 голос
/ 03 сентября 2010

Здравствуйте, у меня есть коллега, который является разработчиком процедурного кода и имеет такое же имя сервера smtp, которое находится в 120 различных файлах, теперь я должен изменить их на что-то другое.Но сделать это один за другим было бы невозможно.Я использую "grep" для рекурсивного поиска строки во всех файлах, находящихся в этом каталоге.Но я не уверен, что grep может отредактировать файл и заменить его новой строкой.

Спасибо

Ответы [ 4 ]

4 голосов
/ 03 сентября 2010

Разве это не должно быть на сервере?

В любом случае, вы должны смотреть на комбинацию find и sed.

Возможно что-то вроде:

find . -iname "<filepattern>" -exec sed -e "s/<regex to look for>/<replacement>/g" -i {} \;
2 голосов
/ 03 сентября 2010

Использовать sed.

grep -rl smtp1.example.com . | xargs sed -i 's/smtp1.example.com/smtp2.example.com/g'

, что означает поиск всех файлов, содержащих smtp1.example.com;вывести их имена;передайте каждое имя файла команде sed, которая выполняет поиск и замену каждого файла.

grep будет перечислять только те файлы, которые действительно содержат текст;это минимизирует количество файлов, для которых вызывается sed.(Использование find -type f приводит к вызову sed для любого файла.)

1 голос
/ 03 сентября 2010
find /directory -type f -exec sed -i 's/oldname/newname/g' {} +

Выполняет рекурсивный поиск по /directory и использует sed для поиска и замены. {} заменяется найденными именами файлов.

0 голосов
/ 03 сентября 2010

Может быть как то так?

find /path/to/start/from/ -type f | xargs perl -pi -e 's/textToFind/TextToReplace/g'

...