【问题标题】:Delete lines between two patterns excluding the other lines containing these pattern删除两个模式之间的行,不包括包含这些模式的其他行
【发布时间】:2020-06-12 19:22:43
【问题描述】:

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

我试图删除 PATTERN1(aaa) 和 PATTERN2(ccc) 之间的空行,在我的示例中为第 8 行...此行将不会始终位于同一位置,这就是我尝试删除的原因它使用 2 种模式。

基本上归结为:“如果在 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

提前谢谢你。

【问题讨论】:

  • 试着用另一种方式说出你想做什么,这样像 /me 这样愚蠢的人就能明白你想做什么...... ????
  • 您已经知道 sed 不是解决此问题的正确工具,并且您使用 awk 得到了许多类似问题的答案,所以为什么还要发布 sed 尝试。
  • 不清楚为什么您不想删除第 3 行。 is也在aaaccc之间,也是空的?
  • 但是第1行使用的是aaa,第9行使用的是ccc,第3行是空行......
  • 这是一个棘手的问题。基本上它归结为:“如果在aaaccc 之间找到一个空行,则将其删除。不要删除模式aaaaaa 之间的空行”

标签: awk


【解决方案1】:
$ 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 时重新启动它(在打印按原样存储的内容之后)。

【讨论】:

  • Ed Morton,谢谢大师,代码运行良好。这正是我想要的。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 2012-02-10
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多