我想/var/www
用/home/lokesh/www
withsed
命令更改文件
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)