编辑:我find了解决办法。 这个命令起作用,以防有人发现它有用。 i.bak修饰符对每个更改的文件进行备份。
find /pathoffilestochange -name "*.php" | xargs sed 's|/wrong/path/|/correct/path/|g'
你好,
我想在几十个.php文件中改变一个path。 我不知道如何使用sed,但是我在网上的某个地方得到了这个命令,并成功地使用了它。
find /ruta -name "*.txt" | xargs sed -i.bak 's/charset=Foo/Bar/g'
除了现在我需要将分隔符更改为不同的字符,hece @。 这是我目前的命令:
find /pathoffilestochange -name "*.php" | xargs sed -i.bak 's@charset=/wrong/path/@/correct/path/@g'
它不工作,它不给任何错误,但我检查文件,他们保持不变。
我以root用户身份执行命令,这是文件所有者,权限似乎没问题,所以一定不能成为问题。 我正在运行Debian。
用@replace保留的分隔符将不起作用。 你必须做的就是像这样逃避你的斜线\/用\字符,你可以在正则expression式中取消一个字符的特殊含义。
所以,你的命令需要如下所示:
find /pathoffilestochange -name "*.php" | xargs sed -i.bak \ 's/charset=\/wrong\/path\//\/correct\/path\//g'
这很令人困惑,但这正是正则expression式的工作原理。
顺便说一下,在-i.bak之后的单个反斜杠,我取消了新行字符的含义,所以我可以在两行上使用这个命令以方便阅读。
你使用的是什么版本的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