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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

追问

非常感谢您的提示,完美的答案。 在这里我再追问一下,为什么'$name'要用单引号, 果然我试了一下换成双引号或者什么也不加的情况下,不能完成删除。但是据我所知道的,一般Shell变量在语句中出现,都是以双引号扩起来的。这次是为什么呢?

追答

其实不是$name要加单引号,而只是用于结束前面的单引号,和再开始后面的单引号,从而将$name置入单引号外面的shell环境中,才能得到shell解析。单引号内为sed环境。

参考技术A 给你个例子:

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

注解:sed不必一定要用 / 来分隔,你的case,要代替的字符里有 / 所以用 | 来分隔,只要你的字串里没有‘|’,那麼这个sed就会成功。追问

在's'替换的情况下,可以用别的字符代替,但是在'd'删除的请况下,好像就不行了。
我是想做这个删除操作:
~$ name=/usr/local/bin/
~$ sed -i "/$name/d" ./hello

追答

你如果只是想把 /usr/local/bin 这部分从整行中删除掉,那麼可以用‘s'来substitute with nothing,例如:

echo "a b c /usr/local/bin d e f" | sed "s|/usr/local/bin||"
a b c d e f

要是你要把整行去掉,只要这一行中有/usr/local/bin这个pattern,那麼建议你用xiehuahere的
grep -v command

追问

    是的,我需要把正行去掉。 xiehuahere的第一种方法也不错, 第二种方法要多建一个文件,感觉还是第一种方法更直接一些。 同样感谢您的解答

参考技术B sed -i "/[$name]/d" hello

每日一道shell练习(09)——sed处理

1. 习题

对一个文件,1至5行删除带有英文的行,6至10行删除里面的英文字符;

2. 分析

这种要求,用sed命令就可以解决了,主要用到匹配替换的知识。

3. 脚本

#!/bin/bash

sed  -n ‘1,5p‘  a.txt  |  sed  ‘/[a-zA-Z]/d‘
sed  -n ‘6,10p‘ a.txt  |  sed  ‘s/[a-zA-Z]//g‘
sed  -n ‘11,$p‘ a.txt

前两个要求,必须使用行号匹配。主要sed是一个流编辑处理器,它是一行一行地接收输入数据,然后再处理。

-n 和 -p 选项配合使用,就是只输出匹配的内容。所以,在前两行命令的意思就相当于,匹配到对应的行后,只处理这些行,然后通过管道,把它们传给后边的sed命令处理。

第三行的sed命令,就是把不用处理的文本都直接输出屏幕。这样,在屏幕上看来,就相当于完整地处理了整个文本的内容了。

以上是关于Sed 删除匹配行,匹配的字符用Shell变量替换,且变量里含有斜杠“/”时,无法删除的主要内容,如果未能解决你的问题,请参考以下文章

sed匹配全行,行首,行尾后替换或添加字符

sed命令,搜索某个字符串,结果有多个匹配行,在第一个匹配行的前面添加一行内容

每日一道shell练习(09)——sed处理

sed 匹配多行,在行首添加字符

shell脚本如何删除指定字符串,文档如下:

shell变量替换