42

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

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

但这给出了以下错误:

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

我该怎么做这个替换?

4

8 回答 8

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

递归地做

find /path -type f -iname '*.php' -exec sed -i.bak 's/old/new/' "{}" +;
于 2010-03-26T11:51:54.740 回答
33

可能有不那么冗长的解决方案,但我们开始吧:

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

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

于 2010-03-26T11:07:01.340 回答
11

这个非常简单,没有 for 或循环,可以处理任意数量或嵌套的目录

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

于 2017-10-30T09:00:44.920 回答
10

sed您在命令参数周围使用 Unicode 撇号(右单引号 - U2019)而不是 ASCII(0x27)撇号。

于 2010-03-26T16:42:31.997 回答
8

我知道我真的迟到了,但仍然:

find . -type f -name "*.php"|xargs sed -i 's/old/new/g'
于 2018-11-19T10:09:47.663 回答
4
perl -pi -e 's/old/new/g' *.php
于 2010-03-26T11:39:46.157 回答
3

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

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

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

于 2018-08-21T15:25:11.143 回答
-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
于 2010-03-26T11:11:13.610 回答