编辑:我找到了解决方案。如果有人觉得这个命令有用,它就有效。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