帮助使用SED命令替换多个文件中的文本

帮助使用SED命令替换多个文件中的文本

编辑:我找到了解决方案。如果有人觉得这个命令有用,它就有效。i.bak 修饰符会备份每个更改的文件。

find /pathoffilestochange -name "*.php" | xargs sed 's|/wrong/path/|/correct/path/|g'

你好,

我想更改数十个 .php 文件中的路径。我不知道如何使用 sed,但我之前在互联网上的某个地方找到过此命令,并成功使用了它。

 find /ruta -name "*.txt" | xargs sed -i.bak 's/charset=Foo/Bar/g'

但现在我需要将分隔符更改为其他字符,因此是 @。这是我当前的命令:

find /pathoffilestochange  -name "*.php" | xargs sed -i.bak 's@charset=/wrong/path/@/correct/path/@g'

它不工作,也没有给出任何错误,但我检查了文件,它们保持不变。

我以 root(文件所有者)身份执行该命令,权限似乎没有问题,所以这肯定不是问题所在。我正在运行 Debian。

答案1

仅仅用 @ 替换保留分隔符是行不通的。你要做的就是像这样转义你的斜线字符,\/这样\你就取消了正则表达式中字符的特殊含义。

因此,您的命令需要如下所示:

find /pathoffilestochange -name "*.php" | xargs sed -i.bak \ 's/charset=\/wrong\/path\//\/correct\/path\//g'

这很令人困惑,但这就是正则表达式的工作方式。

顺便说一下,用后面的单个反斜杠-i.bak取消了换行符的含义,这样我就可以将这个命令放在两行上,以便于阅读。

答案2

您正在使用哪个版本的 sed?对我有用:

$ cat foo 
hello charset=/wrong/path/fcc yes
$ find . -name foo | xargs sed -i.bak 's@charset=/wrong/path/@/correct/path/@g'
$ cat foo
hello /correct/path/fcc yes
$ sed --version
GNU sed version 4.2.1

相关内容