【问题标题】:sed: How to delete lines matching a pattern that contains forward slashes?sed:如何删除与包含正斜杠的模式匹配的行?
【发布时间】:2014-09-30 03:34:30
【问题描述】:

假设文件/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。

【问题讨论】:

标签: linux bash sed


【解决方案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/ 中使用斜杠,如果它们以您在答案中显示的方式进行转义。

【讨论】:

  • +1:很好,我记得在某处读过关于模式分隔符的文章,但忘记了。感谢您的复习。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    为什么要使用正斜杠作为分隔符?只需使用其他东西,例如逗号:

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

    或冒号:

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

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

    注意,如果你想改变文件本身,而不是输出结果,你需要“就地”标志-i

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

    【讨论】:

    • 你在用什么sed? GNU sed manual Sec 3.2 表示,如果您使用不同于/ 的分隔符作为地址,则必须对其进行转义。 (请注意,这不适用于s 命令,仅适用于地址说明符。)
    • 如果您阅读了我的问题,我确实尝试了不同的分隔符,但发现这不起作用。
    猜你喜欢
    • 2019-05-11
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多