awk regex 如何匹配或捕获该字符串

Gab*_*abe 3 regex bash awk

如何匹配或捕获这些字符串:

到目前为止,已经尝试了这两种正则表达式模式,它们都实现了相同的逻辑匹配:

/file="ZZ([^-]+)-[^"]+\.XML"/- awk

/(?<=ZZ)\w++/- awk 不支持

要在 awk 中处理的文本:

file="ZZ12345678-20170101.XML"
file="ZZ87654321-19990101.XML"
file="ZZAA123456-20170101.XML"
file="ZZAA123456-20170101.XML"
file="ZZAA123456A1-20170101.XML"
file="ZZBB654321B2-19990101.XML"
file="ZZCC123456C3-20170101.XML"
Run Code Online (Sandbox Code Playgroud)

问题匹配是一系列数字后面的一个字母和一个数字A1, B2C3问题始终是一系列数字后面的单个字母和数字。

file="ZZ12345678-20170101.XML"正确匹配12345678

file="ZZ87654321-19990101.XML"正确匹配87654321

file="ZZAA123456-20170101.XML"正确匹配AA123456

file="ZZBB654321-20170101.XML"正确匹配BB654321

file="ZZAA123456A1-20170101.XML"错误匹配AA123456A1目标匹配项AA123456

file="ZZBB654321B2-19990101.XML"错误匹配BB654321B2目标匹配项BB654321

file="ZZCC123456C3-20170101.XML"错误匹配CC123456C3目标匹配项CC123456

感谢您的帮助和示例方法

Ed *_*ton 6

$ sed 's/.*ZZ\([[:upper:]]*[0-9]*\).*/\1/' file
12345678
87654321
AA123456
BB654321
AA123456
BB654321
BB654321
Run Code Online (Sandbox Code Playgroud)

或者使用 GNU awk 将第三个参数设置为 match():

$ awk 'match($0,/ZZ([[:upper:]]*[0-9]*)/,a){print a[1]}' file
12345678
87654321
AA123456
BB654321
AA123456
BB654321
BB654321
Run Code Online (Sandbox Code Playgroud)

或 GNU awk 的 gensub():

$ awk '{print gensub(/.*ZZ([[:upper:]]*[0-9]*).*/,"\\1",1)}' file
12345678
87654321
AA123456
BB654321
AA123456
BB654321
BB654321
Run Code Online (Sandbox Code Playgroud)