Sed 删除匹配行,匹配的字符用Shell变量替换,且变量里含有斜杠“/”时,无法删除

~$ cat hello
/usr/local/bin/
~$ name=/usr/local/bin/
~$ sed -i "/$name/d" ./hello
sed: -e expression #1, char 3: unknown command: `u' (命令报错)
~$ sed -i "#$name#d" ./hello (修改语法,用# 代替/)
~$ cat hello
/usr/local/bin/ (仍然没有删除掉)

请问哪位大侠有解决办法

“修改语法没脊,用#代替”,这个只能用在sed的s替换命令中,如:s/A/B/可以写为s#A#B#

但直接正则匹配 /正则/ 是不可以这样用#替代的。

这里提供两个方法供参考:

1)先用s命令将此枯辩渗要删除的路径替换为一个文件中不可能出现的唯一字符串,然后再通过正则匹配该字符串删除该行。可以写在一条sed语句中。

name=/usr/local/bin/
sed -i 's#'$name'#EXCLUSIVE#;/EXCLUSIVE/d' hello

2) grep也支持正则灶肢,可以使用grep -v反向过滤。

name=/usr/local/bin/
grep -v "$name" hello >output
mv output hello

给你个例子:

kshlee> echo "/usr/local/bin" | sed "s|/|#|g"
#usr#local#bin

注解:sed不必一定要配衡用 / 来分隔,你的改闷case,要代替的字符里有 / 所以用 | 来分隔,只要你的字串里没有‘|’,那麼这个核卖弯sed就会成功。
sed -i "/[$name]/d" hello