使用sed查找由模式包围的文本

时间:2014-03-11 15:09:05

标签: regex bash sed sh

我有这样的配置文件:

[whatever]
Do I need this? no!

[directive]
This lines I want
Very much text here
So interesting

[otherdirective]
I dont care about this one anymore

现在,我希望匹配[directive][otherdirective]之间的行,而不匹配[directive][otherdirective]

如果未找到[otherdirective],则应返回文件末尾之前的所有行。 [...]可能包含任何数字或字母。

尝试

我使用这样的sed尝试了这个:

sed -r '/\[directive\]/,/\[[[:alnum:]+\]/!d

此尝试的唯一问题是第一行是[directive],最后一行是[otherdirective]

我知道如何再次管道来截断第一行和最后一行但是有一个sed解决方案吗?

4 个答案:

答案 0 :(得分:2)

您可以像尝试一样使用范围,并在其中使用//否定。当它为空时,它会重复使用匹配的最后一个正则表达式,因此它将跳过两条边线:

sed -n '/\[directive\]/,/\[otherdirective\]/ { //! p }' infile

它产生:

This lines I want
Very much text here
So interesting

答案 1 :(得分:1)

这是一种使用awk获取数据部分的好方法。

awk -v RS= '/\[directive\]/' file
[directive]
This lines I want
Very much text here
So interesting

将RS设置为空RS=时,它会根据空行将文件分成记录 因此,当搜索[directive]时,它将打印该记录。
通常记录是一行,但由于RS(记录选择器)发生变化,它会给出块。

答案 2 :(得分:0)

好的,经过多次尝试,我找到了解决方案或只是一个解决方案:

sed -rn '/\[buildout\]/,/\[[[:alnum:]]+\]/{
    /\[[[:alnum:]]+\]/d
    p }'

答案 3 :(得分:0)

这就是你想要的吗?

\[directive\](.*?)\[

Look here