考虑输入:
=sec1= some-line some-other-line foo bar=baz =sec2= c=baz
如果我只想处理= sec1 =我可以例如注释掉该部分:
sed -e '/=sec1=/,/=[a-z]*=/s:^:#:' < input
…好吧,差不多。
这将对包括“= sec1 =”和“= sec2 =”行的行进行注释,结果将是:
#=sec1= #some-line #some-other-line # #foo #bar=baz # #=sec2= c=baz
我的问题是:从sed中的/ START /,/ END /范围中排除起始和结束行的最简单的方法是什么?
我知道,对于许多情况下,“s :::”爪的细化可以解决这个特定的情况,但我是在通用解决方案之后。
在“Sed – An Introduction and Tutorial”Bruce Barnett写道:“以后我会告诉你如何限制一个命令,但不包括包含指定模式的行”,但我不能找到他实际显示的地方。
在“USEFUL ONE-LINE SCRIPTS FOR SED”由Eric Pement编译,我只能找到包容性的例子:
# print section of file between two regular expressions (inclusive) sed -n '/Iowa/,/Montana/p' # case sensitive
这应该做的诀窍:
sed -e '/=sec1=/,/=sec2=/ { /=sec1=/b; /=sec2=/b; s/^/#/ }' < input
这在sec1和sec2之间匹配,然后使用b命令跳过第一行和最后一行。这将在sec1和sec2(独占)之间留下所需的行,并且s命令添加注释符号。
不幸的是,你需要重复regexp来匹配分隔符。据我所知,没有更好的方法来做到这一点。至少你可以保持regexp干净,即使他们使用了两次。
这是从SED FAQ: How do I address all the lines between RE1 and RE2,excluding the lines themselves?改编