unix – 排除第一行和最后一行从sed/START /,/ END /

考虑输入:
=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?改编

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...