我需要递归搜索目录,并在所有找到的文件中替换字符串(例如http://development:port/URI)与另一个(比如http://production:port/URI)。谁能帮忙?shell脚本递归浏览一个目录并替换一个字符串
如果该脚本可以打印出修改过的文件并将搜索/替换模式作为输入参数,那将会好得多。
问候。
我需要递归搜索目录,并在所有找到的文件中替换字符串(例如http://development:port/URI)与另一个(比如http://production:port/URI)。谁能帮忙?shell脚本递归浏览一个目录并替换一个字符串
如果该脚本可以打印出修改过的文件并将搜索/替换模式作为输入参数,那将会好得多。
问候。
试试这个
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
希望这有助于。
请注意,旧文件将保存为* .bak,它间接满足要求:“打印出修改过的文件”。 – 2008-09-23 23:04:00
这听起来像你会从间接层获益。 (但那么,谁不会呢?)
我在想你可以在一个位置有特殊的字符串。在运行时引用配置设置,或在构建时使用正确的字符串生成这些文件。稍有更多的反馈
find . -type f | xargs grep -l development | xargs perl -i.bak -p -e 's(http://development)(http://production)g'
另一种方法:
找到。 -type f | xargs sed -i s/pattern/replacement/g
额外的注意:你必须在模式中用反斜杠来引号:... sed -i s/\“hello \”/ hi/g – nickf 2009-01-05 02:35:09
使用zsh
所以对于高级globing,只能使用一个命令。 例如: -
sed -i 's:pattern:target:g' ./**
HTH
不要试图在上述范围内工作的svn/cvs的目录,因为它也将修补的.svn /将该.cvs,这绝对不是你想要的。例如,要避免.svn修改,请使用find。 -type f | fgrep -v .svn | xargs sed -i's/pattern/replacement/g'
什么平台?你会接受哪些语言? – 2008-09-23 22:49:13