簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM