使用单行shell命令替换所有文件中的特定文本

时间:2010-03-26 11:00:12

标签: shell sed shellexecute

我有一个重命名的js文件,我必须在每个php页面调用。现在我想使用shell替换旧名称。 我使用的是: -

sed -i ’s/old/new/g’ *

但是这会产生以下错误: -

sed: -e expression #1, char 1: unknown command:

现在我该如何替换?

9 个答案:

答案 0 :(得分:49)

sed -i.bak 's/old/new/g' *.php

以递归方式执行

find /path -type f -iname '*.php' -exec sed -i.bak 's/old/new/' "{}" +;

答案 1 :(得分:27)

可能没有那么冗长的解决方案,但我们走了:

for i in *; do sed -i 's/old/new/g' "$i"; done

请注意,它只适用于文件系统的当前级别,子目录中的文件不会被修改。此外,您可能希望将*替换为* .php,或者进行备份(在-i之后传递参数,它将使用给定的扩展名进行备份)。

答案 2 :(得分:9)

您在sed命令参数周围使用的是Unicode撇号(RIGHT SINGLE QUOTATION MARK - U2019)而不是ASCII(0x27)撇号。

答案 3 :(得分:7)

这个非常简单,没有for或loop,并且处理任何数字或嵌套目录

grep -rl 'oldText' [folderName-optional] | xargs sed -i 's/oldText/newText/g'

答案 4 :(得分:4)

perl -pi -e 's/old/new/g' *.php

答案 5 :(得分:2)

为完整起见,请提供上述接受的答案的OSX兼容版本(以回答@jamescampbell的评论)

for i in *.php; do sed -i .orig 's/old/new/g' "$i"; done

此命令创建.orig备份文件。

答案 6 :(得分:2)

我知道我真的很晚,但仍然:

find . -type f -name "*.php"|xargs sed -i 's/old/new/g'

答案 7 :(得分:0)

使用双引号

sed -i "s/old/new/g" *

答案 8 :(得分:-3)

试试这个:

ls | grep "php" > files.txt
for file in $(cat files.txt); do
    sed 's/catch/send/g' $file > TMPfile.php && mv TMPfile.php $file
done