Сценарий оболочки для рекурсивного просмотра каталога и замены строки - PullRequest
3 голосов
/ 24 сентября 2008

Мне нужно рекурсивно искать в каталогах и заменять строку (скажем, http://development:port/URI) другой (скажем, http://production:port/URI) во всех файлах, где бы она ни находилась. Кто-нибудь может помочь?

Было бы намного лучше, если бы этот скрипт мог распечатывать измененные файлы и принимать шаблоны поиска / замены в качестве входных параметров.

Привет.

Ответы [ 5 ]

6 голосов
/ 24 сентября 2008

найти. тип F | xargs sed -i s / выкройка / замена / g

5 голосов
/ 24 сентября 2008

Попробуйте это:

find . -type f | xargs grep -l development | xargs perl -i.bak -p -e 's(http://development)(http://production)g'

Другой подход с чуть большей обратной связью:

find . -type f | while read file
do
    grep development $file && echo "modifying $file" && perl -i.bak -p -e 's(http://development)(http://prodution)g' $file
done

Надеюсь, это поможет.

2 голосов
/ 24 сентября 2008

Звучит так, будто вы выиграли бы от слоя косвенности. (Но тогда кто бы не стал?)

Я думаю, что у вас может быть специальная строка только в одном месте. Либо обратитесь к параметрам конфигурации во время выполнения, либо сгенерируйте эти файлы с правильной строкой во время сборки.

1 голос
/ 17 сентября 2009

Не пытайтесь выполнить вышеизложенное в рабочем каталоге svn / cvs, поскольку он также исправит файл .svn / .cvs, что, безусловно, не то, что вам нужно Например, чтобы избежать изменений в .svn, используйте find. тип F | fgrep -v .svn | xargs sed -i 's / pattern / замена / g'

0 голосов
/ 25 сентября 2008

Используйте zsh, поэтому при расширенном перемещении можно использовать только одну команду E.g.:

sed -i 's:pattern:target:g' ./**

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...