[英]sed: How to delete lines matching a pattern that contains forward slashes?
假设文件/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。
你非常接近。 对模式分隔符使用非标准字符时,例如|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/
使用斜杠。
一些挖后,我发现这是可能逃脱/
使用模式字符串\\
。 这样可行:
$ sed '/^\/dev\/xvdb/d' /etc/fstab
为什么使用正斜杠作为你的分隔符的痴迷? 只需使用别的东西,比如逗号:
sed ',^/dev/xvdb,d' /etc/fstab
或冒号:
sed ':^/dev/xvdb:d' /etc/fstab
或者无论什么使它最容易阅读。 分隔符可以是任何字符。 惯例是使用正斜杠,但是当它变得笨拙时,将其切换到其他东西。
注意,如果要更改文件本身,而不是输出结果,则需要“in place”标志-i
:
sed -i ':^/dev/xvdb:d' /etc/fstab
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.