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?改编 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |