我有这样的配置文件:
[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
解决方案吗?
答案 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)