如何匹配或捕获这些字符串:
到目前为止,已经尝试了这两种正则表达式模式,它们都实现了相同的逻辑匹配:
/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
, B2
。C3
问题始终是一系列数字后面的单个字母和数字。
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
感谢您的帮助和示例方法
$ 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)