sed删除两个模式之间的行,没有第二个模式,包括第一个模式

时间:2017-03-20 08:32:18

标签: design-patterns sed

我的输入文件如下所示:

[1234]
text 
text
text

[3456]
text 
text
text

[7458]
text 
text
text

我想删除模式之间的所有行,包括FROM_HERE和排除TO_HERE。

sed '/FROM_HERE/,/TO_HERE/{//p;d;}'

现在我有:

sed '/^\['"3456"'\]/,/^\[.*\]/{//p;d;}'

但是此命令也不会删除FROM_HERE行。对于最后的3456,输入文件应如下所示:

[1234]
text 
text
text

[7458]
text 
text
text

我怎样才能做到这一点?感谢。

3 个答案:

答案 0 :(得分:1)

您可以删除模式中的行到下一个空行:

sed '/^\['"3456"'\]/,/^$/{d;}' file

答案 1 :(得分:0)

注意:为了示例,我将仅匹配3456和7458(而不是"完全[3456]")

您可以执行以下操作:

~$ cat t
[1234]
text1
text1
text1

[3456]
text2
text2
text2

[7458]
text3
text3
text3

~$ sed '/3456/,/7458/{/7458/!d}' t
[1234]
text1
text1
text1

[7458]
text3
text3
text3

即:在FROM_HERE和TO_HERE之间(/3456/,/7458/)执行以下操作:如果不匹配TO_HERE({/7458/!d}),则删除

答案 2 :(得分:0)

要删除从模式[3456]开始直到遇到模式[7458](不包括带有结束模式的行)的行,请使用以下命令:

sed '/^\[3456\]/,/\[7458\]/{/\[7458\]/b;d;}' testfile
此处

/\[7458\]/b - b命令用于跳过包含模式\[7458\]

的行

d命令是删除一行 输出:

[1234]
text 
text
text

[7458]
text 
text
text

https://www.gnu.org/software/sed/manual/sed.html#Branching-and-flow-control