从unix终端搜索并替换多个文件上的字符串

时间:2011-09-24 00:07:18

标签: unix sed terminal replace

我们正在将代码库中的所有静态html页面转换为php页面。第一步是将所有.html文件扩展名更改为.php(我已经这样做了)。第二步是更新每个html页面中的所有链接以指向新的php页面。

(例如,在index.php中我有指向contact.html和about-us.html的链接。现在我们已经将.html文件扩展名替换为.php,我们需要更改contact.html以进行联系。 php,同样,about-us.html到about-us.php)。

我现在要做的是在多个文件中搜索特定字符串。 (在许多文件中搜索“contact.html”,例如index.php,index2.php,index3.php等等。)之后,用“contact.php”替换所有这些文件中的所有“contact.html” ”

我对unix命令行并不熟悉,到目前为止我已经在论坛中看到了其他人的类似问题,但不太明白哪一个可以帮助我实现我想要的。我正在使用cygwin,如果可能的话,我需要在没有perl脚本的情况下解决这个问题,因为我没有安装它。我需要尝试使用sed,grep,find或其他任何东西。

所以,如果你们中的任何人认为这是重复的,请指出我在那里的相关帖子。谢谢你的时间。

6 个答案:

答案 0 :(得分:34)

试试这个:

find . -name '*.html' -exec sed -i 's/\.html/\.php/g' "{}" \;

它会在当前和子目录中找到以.html结尾的所有文件,并在每个文件上运行sed,以.html替换.php它们。

有关详细信息,请参阅http://content.hccfl.edu/pollock/unix/findcmd.htm

答案 1 :(得分:14)

在我的Mac上,我必须在-i选项中添加一个参数:要添加到名称的扩展名(在这种情况下,没有任何内容,因此文件存储在原位)。

find . -name '*.html' -exec sed -i '' 's/\.html/\.php/g' "{}" \;

答案 2 :(得分:1)

You can certainly use ack to select your files to update. For example,
to change all "foo" to "bar" in all PHP files, you can do this from 
the Unix shell: 

perl -i -p -e's/foo/bar/g' $(ack -f --php)

来源:man ack

答案 3 :(得分:0)

答案 4 :(得分:0)

这对我有用:

find . -type f -print0 | xargs -0 sed -i 's/str1/str2/g'

答案 5 :(得分:0)

下面的脚本可以帮助替换文件中的字符串:

#!/bin/bash
echo -e "please specify the folder where string has need to be replaced: \c"
read a
echo -e "please specify the string to be replaced: \c"
read b
echo -e "please specify the string: \c"
read c
find $a -type f -exec sed -i 's/'"$b"'/'"$c"'/g' {} \; > /dev/null 2>&1
if [ $? -eq 0 ]
then
echo "string has been replaced..."
else                                                                         echo "String replacement has been failed"
exit0
fi