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



我只想删除模式1(aaa(和模式2(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

尝试

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 }

$ awk -f tst.awk file
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

上面删除了ccc和之前最近的aaa之间的行块中的所有空行。为了隔离该块,它在看到aaa时启动该块,然后在遇到ccc之前遇到下一个aaa时重新启动(按原样打印后(。

最新更新