gpt4 book ai didi

bash - 仅使用 awk 在两个正则表达式之间打印

转载 作者:行者123 更新时间:2023-11-29 09:46:28 26 4
gpt4 key购买 nike

我在寻找一种在两个字符串之间打印的方法时迷路了。这两个字符串都包含特殊字符,如 <,> .

我可以使用 sed 实现这一目标完美(但不能使用),但我需要 awk因为我需要对结果进行进一步的文本操作。

这是示例文件:

$ cat input.txt
RANDOM CLI> THIS IS BEFORE WINDOW
RANDOM CLI>
RANDOM CLI>log list all show...
bla bla
bla bla
bla bla bal
bla bla bla bla
RANDOM CLI>
RANDOM CLI>
RANDOM CLI>THIS IS OUT OF WINDOW

我对 “RANDOM CLI>log list all show...” 和下一个 “RANDOM CLI>” 之间的文本感兴趣

这可以使用 sed 来完成,如下所示:

$ sed -n '/CLI>log/,/ CLI>/p' cli
RANDOM CLI>log list all show...
bla bla
bla bla
bla bla bal
bla bla bla bla
RANDOM CLI>

但正如我提到的,sed不适合我的要求,需要 awk唯一的解决方案。

一些尝试转义特殊字符但没有帮助。

awk '/CLI>log/,/ CLI>/' input.txt
RANDOM CLI>log list all show...

awk '/CLI\>log/,/CLI\>/' input.txt

awk '/CLI>log/{f=1;for (i=0;i<=NR;i++){getline}}/CLI>/{f=0}f' cli

最佳答案

基本 awk 范围不起作用,因为模式 CLI> 也在起始范围内找到,从而导致 awk 仅在第一行后停止打印。

您可以锚定正则表达式来打印整个范围:

awk '/ CLI>log/,/ CLI>$/' input.txt

RANDOM CLI>log list all show...
bla bla
bla bla
bla bla bal
bla bla bla bla
RANDOM CLI>

否则使用 awk 你也可以这样做:

awk 'p && / CLI>/{print; p=0} / CLI>log/{p=1} p' input.txt

此命令使用切换标志 p 来决定是否打印。当我们在一行中获取 CLI>log 时,p 设置为 1。我们一直打印直到我们得到下一个 CLI> 文本,同时 p==1。一旦我们得到它,我们就打印结束行并将 p 设置为 0 以便我们停止打印。

关于bash - 仅使用 awk 在两个正则表达式之间打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39367707/

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