查找并替换为 sed 在查找和替换字符串中使用斜杠

查找并替换为 sed 在查找和替换字符串中使用斜杠

我想/var/www/home/lokesh/wwwwithsed命令更改文件

sed -i 's///var//www///home//lokesh//www/g' lks.php

但这给出了错误

sed: couldn't open file ww///home//lokesh//www/g: No such file or directory

答案1

不确定您是否知道,但sed有一个很棒的功能,您不需要使用 a/作为分隔符。

所以,你的例子可以写成:

sed -i 's#/var/www#/home/lokesh/www#g' lks.php

它不需要是#任何一个,它可以是任何单个字符。例如,使用 a3作为分隔符:

echo "foo" | sed 's3foo3bar3g'
bar

答案2

正如其他人指出的那样,您可以使用不同的字符作为分隔符,如下所示:

sed -i 's!pattern!replacement!g' /path/to/file

但是,如果没有方便的字符来代替/分隔符,您还可以通过在每个字符前面加上反斜杠来转义pattern和中的任何嵌入分隔符。下面是一个使用替换为 的分隔符的示例:replacement\//some/path../some/replacement

sed -i 's/\/some\/path/..\/some\/replacement/g'

不过,对于人类来说,阅读起来比较困难,所以一般来说,如果可能的话,最好使用不同的字符作为分隔符,如下所示:

sed -i 's!/some/path!../some/replacement!g'

答案3

您是否尝试过使用类似的东西:

sed -i 's@/var/www@/home/lokesh/www@g' lks.php

答案4

您可以在 bash 脚本中的 sed 命令前面放置一个简单的 premat 命令,该命令会屏蔽路径变量中的斜杠。假设要交换的路径变量位于 $P0 中:

P0="/foo/foo/foo/file"; 
P0=(${P0////\\/});  #masked Slash to form: \/foo\/foo\/foo\/file

应与以下对象交换:

P1="/whatever/youwant/file"; 
P1=(${P1////\\/}); #masked slash to form \/whatever\/youwant\/file

之后简单地使用 sed :

sed -i "s/${P0}/${P1}/" /wherever/that/should/go/file;

这适用于 bash --version 5.1.4(1)

相关内容