gpt4 book ai didi

grep 由两个关键行分隔的文本 block

转载 作者:行者123 更新时间:2023-12-04 16:34:22 24 4
gpt4 key购买 nike

我有一个文本文件,其中包含大致格式如下的文本块:

Beginning of block
...
...
...
.........some_pattern.......
...
...
End of block

Beginning of block
...
... etc.

块可以有任意数量的行,但始终以两个分隔符开头。我想做的是匹配“some_pattern”并将整个块打印到标准输出。通过上面的例子,我只会得到这个:
Beginning of block
...
...
...
.........some_pattern.......
...
...
End of block

我试过这样的事情,但没有成功:
grep "Beginning of block\n.*some_pattern.*\n.*End of block"

知道如何用 grep 做到这一点吗? (或者可能使用其他工具)

最佳答案

我猜 awk更适合这个:

awk '/Beginning of block/ {p=1};
{if (p==1) {a[NR]=$0}};
/some_pattern/ {f=1};
/End of block/ {p=0; if (f==1) {for (i in a) print a[i]};f=0; delete a}' file

解释

它只是在 p 时打印标志是“事件的”和 some_pattern匹配:
  • 当它找到 Beginning of block ,然后使变量 p=1并开始将行存储在数组 a[] 中.
  • 如果找到 some_pattern ,它设置标志 f到 1,这样我们就知道模式已经找到了。
  • 当它找到 End of block它重置 p=0 .如 some_pattern自上次以来已被发​​现 Beginning of block , 打印所有已存储的行。最后a[]清零,f复位;当我们再次相遇时,我们将重新开始Beginning of block .

  • 其他测试
    $ cat a
    Beginning of block
    blabla
    .........some_pattern.......
    and here i am
    hello
    End of block

    Beginning of block
    ...
    ... etc.
    End of block
    $ awk '/Beginning of block/ {p=1}; {if(p==1){a[NR]=$0}}; /some_pattern/ {f=1}; /End of block/ {p=0; if (f==1) {for (i in a) print a[i]}; delete a;f=0}' a
    Beginning of block
    blabla
    .........some_pattern.......
    and here i am
    hello
    End of block

    关于grep 由两个关键行分隔的文本 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19926634/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com