awk匹配正则表达式字符,它不应该

时间:2013-09-20 22:34:28

标签: regex awk

我的awk程序做了一些奇怪的字符匹配。你能解释一下发生了什么,或者指出我的相关文件。

输入文件

| 29900 | St. James | ...
| 33010 | Boole / Kirk | ...

AWK

awk '/\| ([0-9]{5}) \| ([^\|]*)/{print $2 $4}' input-file.txt

结果

29900St.
33010Boole
  • 为什么第一个捕获组$ 1是前导|?通常$ 0是整场比赛,$ 1是第一组。
  • 为什么([^\|]*)会停在./而不是继续阅读?我基本上告诉它“所有不是的字符”毕竟。

2 个答案:

答案 0 :(得分:3)

默认情况下,awk按空格分隔列,因此记录

| 29900 | St. James | ...

我们有$ 1 =“|”,$ 2 =“29900”,$ 3 =“|”,$ 4 =“圣。”,$ 5 =“詹姆斯”,$ 6 =“|”和$ 7 =“......”

此外,与Perl不同,awk不会将捕获括号的内容存储在任何地方(gawk does虽然)

看到你想使用管道作为分隔符,我建议:

awk -F '[[:blank:]]*\\|[[:blank:]]*' -v OFS=, '$2 ~ /[0-9]{5}/ {print $2,$3}'
29900,St. James
33010,Boole / Kirk

如果你对在那里看到2美元和3美元而不是1美元和2美元感到困惑,那么根据定义,考虑一个字段分隔符,它将两个字段分开,并且必须在它之前和之后有一个字段。第一个字段分隔符显示在每行的开头,因此必须有一个由空字符串组成的字段:$ 1将是空字符串。

答案 1 :(得分:2)

awk没有提供访问捕获组的方法,它使用$<number>来访问输入文件的字段。看起来你可以做到:

awk -F' *\| *' '{print $2 $3;}' input-file.txt