使用sed删除两个匹配模式之间的所有行
我有一个像这样的文件:
# ID 1 blah blah blah blah $ description 1 blah blah # ID 2 blah $ description 2 blah blah blah blah
如何使用sed命令删除#
和$
行之间的所有行? 所以结果会变成:
# ID 1 $ description 1 blah blah # ID 2 $ description 2 blah blah blah blah
你能不能请解释一下?
使用这个sed命令来实现:
sed '/^#/,/^\$/{/^#/!{/^\$/!d}}' file.txt
Mac用户(为了防止extra characters at the end of d command
错误extra characters at the end of d command
)需要在右括号之前添加分号
sed '/^#/,/^\$/{/^#/!{/^\$/!d;};}' file.txt
OUTPUT
# ID 1 $ description 1 blah blah # ID 2 $ description 2 blah blah blah blah
说明:
-
/^#/,/^\$/
将匹配以#
开头的行到以$
开头的行之间的所有文本。^
用于开始行字符。$
是一个特殊的字符,所以需要转义。 -
/^#/!
意味着如果开始行不是#
-
/^$/!
意味着如果行的开始不是$
则执行以下操作 -
d
表示删除
所以总的来说,首先匹配从^#
到^\$
所有行,然后从匹配的行中find不匹配 ^#
行,并且不匹配 ^\$
并使用d
删除它们。
$ cat test 1 start 2 end 3 $ sed -n '1,/start/p;/end/,$p' test 1 start end 3 $ sed '/start/,/end/d' test 1 3
我很久以前做过类似这样的事情:
sed -n -e "1,/# ID 1/ p" -e "/\$ description 1/,$ p"
这是这样的:
-
-n
禁止所有输出 -
-e "1,/# ID 1/ p"
从第一行开始执行直到你的模式和p(打印) -
-e "/\$ description 1/,$ p"
从第二个模式执行直到结束并且p(打印)。
我可能是错误的一些逃避的string,所以请仔细检查。
sed的另一个方法:
sed '/^#/,/^\$/{//!d;};' file
-
/^#/,/^\$/
:从以#
开始的行开始,直到以$
开头的下一行 -
//!d
:删除除地址模式匹配的所有行
一般情况下,如果你有一个abcdeforms的内容的文件,其中a部分在模式b之前,那么c部分在模式d之前,然后在e之后 ,你应用下面的sed
命令,你会得到如下结果。
在这个演示中,输出由=> abcde
表示,其中的字母显示哪些部分在输出中。 因此, ae
仅显示a和e部分的输出, ace
是a , c和e等部分。
请注意,如果b
或d
出现在输出中,那么出现的模式(即它们被视为输出中的部分)。
也不要将/d/
pattern与命令d
混淆。 这些示威中的指挥总是在最后。 模式总是在//
之间。
sed -n -e '/b/,/d/!p' abcde
=> ae
sed -n -e '/b/,/d/p' abcde
=> bcd
sed -n -e '/b/,/d/{//!p}' abcde
=> c
sed -n -e '/b/,/d/{//p}' abcde
=> bd
sed -e '/b/,/d/!d' abcde
=> bcd
sed -e '/b/,/d/d' abcde
=> ae
sed -e '/b/,/d/{//!d}' abcde
=> abde
sed -e '/b/,/d/{//d}' abcde
=> ace