gpt4 book ai didi

regex - 用sed匹配多行模式非贪婪?

转载 作者:行者123 更新时间:2023-12-02 06:59:12 25 4
gpt4 key购买 nike

文件:

[start] cmd1
afadfadf
dafdf
[ok] cmd1
[-] cmd2
[-] cmd3
[start] cmd4
dfdafadf
d
afasdf

daf
[stop] cmd4
[-] cmd5
[-] cmd6
[start] cmd1
adfadd
dafa
dfdd33r55ae
[ok] cmd1
[-] cmd7
[start] cmd8
error...

[stop] cmd8
[-] cmd9
[start] cmd10
exit xx

[stop] cmd10
[-] cmd
[start] cmd1
[ok] cmd1

我想打印所有 block ,例如:[start] ... [stop] cmd...

结果应该是:

[start] cmd4
dfdafadf
d
afasdf

daf
[stop] cmd4
[start] cmd8
error...

[stop] cmd8
[start] cmd10
exit xx

[stop] cmd10

如何使用 sed 做到这一点?

sed -n '/\[start\]/I,/\[stop\]/I p' 将不起作用,因为范围运算符直到找到下一个 [停止]。

编辑:使用@jaybee sed 脚本后,我发现它仍然存在一些问题当[stop] 行多于start 行时,例如:

infile2

[start] cmd1
afadfadf
dafdf
[ok] cmd1
[-] cmd2
[-] cmd3
[start] cmd4
dfdafadf
d
afasdf

daf
[stop] cmd4
[-] cmd5
[-] cmd6
[start] cmd1
adfadd
dafa
dfdd33r55ae
[ok] cmd1
[-] cmd7
[start] cmd8
error...

[stop] cmd8
[-] cmd9
[stop] sum
[stop] cmd1
[stop] cmd2
[start] cmd10
exit xx

[stop] cmd10
[-] cmd
[start] cmd1
[ok] cmd1

它仍然会输出额外的 [stop] 行,如下所示:

[start] cmd4
dfdafadf
d
afasdf

daf
[stop] cmd4
[start] cmd8
error...

[stop] cmd8
[stop] cmd8
[-] cmd9
[stop] sum
[stop] sum
[stop] cmd1
[stop] cmd2
[stop] cmd2
[start] cmd10
exit xx

[stop] cmd10

所以我决定修改 sedsrc 来解决这个问题:

#n
/^\[start\]/I {h;d}
#if match [start] create a new hold buffer then delete the pattern space
/^\[stop\]/I {
#if match [stop] do this
H;x
#append line into hold buffer and then swap the hold buffer to pattern space
/^\[start\]/I{p;d}
#if the buffer contain [start], then it is a complete [start]...[stop] block, print the block,start over with next line
d
#if does not contain [start],start over with next line
}
/^\[.+\]/ {
#if it is other control word, do this
h;d
# clear and put current line to hold buffer, start over with next line
}

H
#append non-control line into hold buffer

现在可以正常使用了,欢迎以后讨论如何使脚本更简洁。

最佳答案

好的,所以我建议您使用保持缓冲区,每当看到新的 [start] 时刷新它,并在看到 [stop] 时打印它。这给出了以下脚本:

#n
/^\[start\]/I {
h;n
}
/^\[stop\]/I {
H;x;p;n
}
H

你把它放在例如sedscr 然后运行得到如下结果:

$ sed -f sedscr infile
[start] cmd4
dfdafadf
d
afasdf

daf
[stop] cmd4
[start] cmd1
adfadd
dafa
dfdd33r55ae
[stop] cmd1
[start] cmd8
error...

[stop] cmd8
[start] cmd10
exit xx

[stop] cmd10

说明

在该行的开头看到 [start] (带有 I 标志,因为您似乎想要不区分大小写),将该行置于保留状态空格,删除其先前的内容 (h),然后输入下一行 (n)。

当看到 [stop] 时,将该行附加到保持空间(H),然后交换模式空间和保持空间(x) 打印模式空间 (p),然后输入下一行 (n)。

在所有其他行上,只需将该行附加到当前保留空间 (H)。

顺便说一句,我脚本开头的 #n 相当于命令行上的 -n:请求 sed 不是将模式空间输出到输出流,除非 p 命令要求。

关于regex - 用sed匹配多行模式非贪婪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25241704/

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