Awk 删除两个图案之间的线条,不包括包含这些图案的其他线条

Awk 删除两个图案之间的线条,不包括包含这些图案的其他线条,awk,Awk,我只想删除PATTERN1(aaa)和PATTERN2(ccc)之间的线,不包括模式匹配的其他线 我试图删除PATTERN1(aaa)和PATTERN2(ccc)之间的空行,在我的示例中是第8行……这一行不会一直在同一位置,这就是为什么我尝试使用这两个模式删除它 基本上可以归结为:“如果在aaa和ccc之间发现一个空行,那么将其删除 输入文件 aaa 409 bbb 201 122 0.98 aaa 1.47 aaa 0.00 aaa 0.00 ccc 0.00 121 0.01 135 1

我只想删除PATTERN1(aaa)和PATTERN2(ccc)之间的线,不包括模式匹配的其他线

我试图删除PATTERN1(aaa)和PATTERN2(ccc)之间的空行,在我的示例中是第8行……这一行不会一直在同一位置,这就是为什么我尝试使用这两个模式删除它

基本上可以归结为:“如果在aaa和ccc之间发现一个空行,那么将其删除

输入文件

aaa 409
bbb 201

122 0.98
aaa 1.47
aaa 0.00
aaa 0.00

ccc 0.00
121 0.01
135 1.99
aaa 409
bbb 201

122 0.98
aaa 1.47
aaa 0.00
aaa 0.00
ccc 0.00
121 0.01
135 1.99
输出文件

aaa 409
bbb 201

122 0.98
aaa 1.47
aaa 0.00
aaa 0.00

ccc 0.00
121 0.01
135 1.99
aaa 409
bbb 201

122 0.98
aaa 1.47
aaa 0.00
aaa 0.00
ccc 0.00
121 0.01
135 1.99
尝试

sed  '/aaa/,/ccc/{//p;d;}' file
sed '/aaa/,/ccc/{//!d}' file
awk '/aaa/{g=1;next}/ccc/{g=0;next}g' file
先谢谢你

$ cat tst.awk
/aaa/ { printf "%s", block; block=""; inBlock=1 }
!inBlock { print }
inBlock {
    block = block $0 ORS
    if ( /ccc/ ) {
        gsub(/\n+/,"\n",block)
        printf "%s", block
        block = ""
        inBlock = 0
    }
}
END { printf "%s", block }

上述操作将删除
ccc
与其前面最近的
aaa
之间的行块中的所有空行。要隔离该块,它会在看到
aaa
时启动该块,然后重新启动(打印存储的原样后)如果在遇到
ccc
之前遇到下一个
aaa


上述操作将删除
ccc
与其前面最近的
aaa
之间的行块中的所有空行。要隔离该块,它会在看到
aaa
时启动该块,然后重新启动(打印存储的原样后)如果在遇到
ccc
之前遇到下一个
aaa

试着用另一种方式说出你想做什么,这样像我这样愚蠢的人就可以理解你想做什么……你已经知道sed不是合适的工具,你可以用awk回答几十个类似的问题,那么为什么还要发布sed尝试呢ts.不清楚您为什么不想删除第三行。它也在
aaa
ccc
之间,并且也是空的?但是第1行使用模式
aaa
,第9行使用模式
ccc
,第3行是空行……这是一个棘手的问题。本质上它归结为:如果在
aaa
ccc
之间发现空行,则将其删除。不要删除模式
aaa
aaa
“试着用另一种方式说你想做什么,这样像我这样愚蠢的人就能理解你想做什么。。。。你已经知道sed不是合适的工具,你用awk回答了几十个类似的问题,所以为什么还要发布sed尝试。不清楚你为什么不想删除第三行。也在
aaa
ccc
之间,并且也是空的?但是第1行使用模式
aaa
,第9行使用模式
ccc
,第3行是空行……这是一个棘手的问题。基本上可以归结为:“如果在
aaa
ccc
之间发现了一条空行,那么就将其删除。不要删除模式
aaa
aaa
之间的空行。”埃德·莫顿,谢谢你,大师,代码工作得很好。这正是我想要的。再一次谢谢你Ed Morton谢谢你maestro代码很好用。这正是我想要的。再次感谢你。