unix 删除文件中的模式以及使用其他模式的模式之前的行

aamkag61  于 2022-12-12  发布在  Unix
关注(0)|答案(4)|浏览(170)

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 :-

  1. Search for property2
  2. and then loop over previous 3 lines
  3. Search if it is a comment (starts with #)
  4. Delete those lines (including the searched pattern and the comments above).
    Can someone help me achieve this? Thanks.
w46czmvw

w46czmvw1#

使用任何awk,这可能是您尝试执行的操作,但您的问题并不清楚:

$ awk -v RS= -v ORS='\n\n' -F'\n' '$NF != "property2"' file
# Comment
# Comment
# Comment
property1
qncylg1j

qncylg1j2#

您可以使用脚本编辑器(如ed)执行以下操作:
1.搜索property2的第一个匹配项(定位到行首)
1.从此处向后搜索 * 不 * 以#开头的行
1.从该行 * 之后 * 到以property2开头的行,删除这些行

  1. w将文件输出到磁盘
  2. q使用编辑器
    一种写法是:
#!/bin/sh

printf '%s\n'             \
        '/^property2'     \
        '?^[^#]'          \
        '+1,/^property2/d' \
        'w'               \
        'q'               \
  | ed input > /dev/null

我把ed的stdout放到/dev/null,因为它会报告它沿着匹配的行,我们对这些行不感兴趣。ed会“就地”修改文件。如果property2之前没有非空的非注解行,这个ed脚本将失败(向后搜索将失败)。
在您的示例输入中,这也将删除节之间的空行,这似乎与您所需的输出相匹配。

ovfsdjhp

ovfsdjhp3#

不清楚你想做什么;也许就是这样:

Mac_3.2.57$cat test.txt
# Comment1
# Comment2
# Comment3
property1

# Comment4
# Comment5
property2
Mac_3.2.57$awk '{if(NR==FNR){{if($0!~/^#/&&startFound==1){startFound=0;end=NR};if($0~/^#/&&startFound==0){startFound=1;start=NR}}}else {if(FNR<start||FNR>=end){print}}}' test.txt test.txt
# Comment1
# Comment2
# Comment3
property1

property2
Mac_3.2.57$
zzwlnbp8

zzwlnbp84#

这可能对你有用(GNU sed):

sed -E '/^#/{:a;N;/^property[^2]/Mb;/^property2/M!ba
             :b;/^#|^property2/!P;s/[^\n]*\n//;tb;d}' file

如果一行不是注解,就让它成为注解。
否则,在图案空间中累积线条。
如果下一行以不为2的属性开始,则打印累加行并重复。
如果后续行不是以property2开始,则继续累计行。
否则,删除注解并打印除最后一行之外的所有行。

相关问题