I have a text file containing this :-
# Comment
# Comment
# Comment
property1
# Comment
# Comment
property2
I wanted to use unix command (awk/sed etc.) to search for a pattern with property2 and then delete all the comments before it. Hence, after operation output should be :-
# Comment
# Comment
# Comment
property1
This is what I tried (using awk command) :-
awk -v pat='^property2' -v comment='^#' '$1~pat{p=NR} p && NR>=p-3{del=($1~comment)} del{next} 1' test.txt
Basically, the logic I tried to use was :-
- Search for property2
- and then loop over previous 3 lines
- Search if it is a comment (starts with #)
- Delete those lines (including the searched pattern and the comments above).
Can someone help me achieve this? Thanks.
4条答案
按热度按时间w46czmvw1#
使用任何awk,这可能是您尝试执行的操作,但您的问题并不清楚:
qncylg1j2#
您可以使用脚本编辑器(如
ed
)执行以下操作:1.搜索
property2
的第一个匹配项(定位到行首)1.从此处向后搜索 * 不 * 以
#
开头的行1.从该行 * 之后 * 到以
property2
开头的行,删除这些行w
将文件输出到磁盘q
使用编辑器一种写法是:
我把
ed
的stdout放到/dev/null,因为它会报告它沿着匹配的行,我们对这些行不感兴趣。ed
会“就地”修改文件。如果property2
之前没有非空的非注解行,这个ed脚本将失败(向后搜索将失败)。在您的示例输入中,这也将删除节之间的空行,这似乎与您所需的输出相匹配。
ovfsdjhp3#
不清楚你想做什么;也许就是这样:
zzwlnbp84#
这可能对你有用(GNU sed):
如果一行不是注解,就让它成为注解。
否则,在图案空间中累积线条。
如果下一行以不为2的属性开始,则打印累加行并重复。
如果后续行不是以
property2
开始,则继续累计行。否则,删除注解并打印除最后一行之外的所有行。