awk正则表达式如何匹配或捕获此字符串

时间:2017-06-19 12:38:08

标签: 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"

问题匹配是一系列数字之后的一个字母和一个数字A1B2C3。问题始终是一系列数字后的单个字母和数字。

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

感谢帮助和示例方法

4 个答案:

答案 0 :(得分:3)

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

或使用GNU awk为第3个arg匹配():

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

或gensub()的GNU awk:

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

答案 1 :(得分:2)

使用sed

sed -E 's/^file=\"ZZ([A-Z]*[0-9]+)[^-]*-[^"]+\.XML\"$/\1/' file

12345678
87654321
AA123456
BB654321
AA123456
BB654321
BB654321

或者您可以使用gnu-awk

awk '{print gensub(/^file=\"ZZ([A-Z]*[0-9]+)[^-]*-[^"]+\.XML\"$/, "\\1", "1")}' file

或使用gnu grep

grep -oP '(?<=file=\"ZZ)([A-Z]*[0-9]+)(?=[^-]*-[^"]+\.XML\"$)' file

答案 2 :(得分:1)

尝试:

DashboardController

使用awk的匹配函数,它正在寻找从字母表到正确数字的正则表达式,然后打印它的子字符串,从RSTART + 2开始直到RLENGTH-2的长度。

答案 3 :(得分:1)

$('select').click(function(){
    var clicked_select = $(this).attr('data-bind');
    // clicked_select will be the number which dynamic element you have clicked. You can use that number with id to access that particular element as a new selector.
});