sed:如何删除与包含正斜杠的模式匹配的行?

时间:2014-08-07 02:32:01

标签: linux bash sed

假设文件/etc/fstab包含以下内容:

/dev/xvda1 / ext4 defaults 1 1
/dev/md0    /mnt/ibsraid    xfs defaults,noatime    0   2
/mnt/ibsraid/varlog /var/log    none    bind    0   0
/dev/xvdb   None    auto    defaults,nobootwait 0   2

我想删除以/dev/xvdb开头的行。所以我试过了:

$ sed '/^/dev/xvdb/d' /etc/fstab
sed: -e expression #1, char 5: extra characters after command
$ sed '?^/dev/xvdb?d' /etc/fstab
sed: -e expression #1, char 1: unknown command: `?'
$ sed '|^/dev/xvdb|d' /etc/fstab
sed: -e expression #1, char 1: unknown command: `|'

这些都没有奏效。我尝试将分隔符更改为?|,因为当模式包含/时,这样做适用于sed替换命令。

我在Debian上使用GNU Sed 4.2.1。

3 个答案:

答案 0 :(得分:29)

你非常接近。当您使用非标准字符作为模式分隔符(例如|pattern|)时,必须首先使用该字符:

$ sed '\|^/dev/xvdb|d' /etc/fstab
/dev/xvda1 / ext4 defaults 1 1
/dev/md0    /mnt/ibsraid    xfs defaults,noatime    0   2
/mnt/ibsraid/varlog /var/log    none    bind    0   0

同样,人们可以使用:

sed '\?^/dev/xvdb?d' /etc/fstab

最后,如果它们以您在答案中显示的方式进行转义,则可以在/pattern/内使用斜杠。

答案 1 :(得分:2)

经过一番挖掘后,我发现可以使用/转义模式字符串中的\。所以这有效:

$ sed '/^\/dev\/xvdb/d' /etc/fstab

答案 2 :(得分:-1)

为什么使用正斜杠作为分隔符的痴迷?只需使用别的东西,比如逗号:

sed ',^/dev/xvdb,d' /etc/fstab

或冒号:

sed ':^/dev/xvdb:d' /etc/fstab

或者任何使它最容易阅读的东西。分隔符可以是任何字符。惯例是使用正斜杠,但是当它变得笨拙时,将其切换到其他东西。

注意,如果你想更改文件本身,而不是输出结果,你需要"到位" flag -i

sed -i ':^/dev/xvdb:d' /etc/fstab