我有一个包含如下文本的文件
输入文件:
------start---------
first line
second line
third line
fourth line
------end-----------
xyx
pqr
------start---------
first line
second line
third line
fourth line
fith line
sixth line
------end-----------
我想要一个输出文件,这样,如果模式之间的行“开始”和“结束”是超过4所有我想删除模式之间的所有这些行,否则我不希望接触他们,如果计数小于或等于4
我需要像下面这样的输出文件,其中我想删除两个模式匹配之间的所有行,只有当行的总数超过4
预期输出文件:
------start---------
first line
second line
third line
fourth line
------end-----------
xyx
pqr
------start---------
------end-----------
我使用了这个sed命令
sed -i '/start/,/end/{//!d}' filename
但是它将不覆盖当模式匹配之间的总行数小于或等于4时避免删除所有行的情况
4条答案
按热度按时间svujldwt1#
使用任何awk,而不是一次阅读所有输入到内存中:
laximzn52#
使用GNU
sed
eivnm1vs3#
你可以用类似的方式使用
perl
代替sed
:这里
perl -0pe
是sed -z
的替代品,但它支持PCRE正则表达式,包括lookaheads和捕获重置\K
。Regex本身意味着:
------start---------\n
-以换行符开始标记,\K
忽略先前匹配的序列,停留在相同的光标位置。替代它的可能是更广为人知的(?<=------start---------\n)
,但\K
具有更好的性能。(?:(?:(?!------(?:end|start)---------).)+?\n){5,}
-至少5行不包含开始或结束标签,(?=------end-----------)
lookahead检查匹配的序列后面是否有结束标记。正则表达式here的演示。
bvjveswy4#