awk中FPAT变量的作用是什么?

9

我从GAWK的GNU页面了解到它可以使用FPAT变量处理数据中的定界符,但是我不知道这是如何工作的。对于CSV文件,FPAT的值为:

FPAT = "([^,]+)|(\"[^\"]+\")"

使用数据:
abc,"pqr,mno"

第一个分组表达式评估所有内容,即不是逗号,这应该将"abc"作为数据,然后在第一个逗号出现时失败。现在我的问题是接下来会发生什么?由于第一个分组表达式失败了,正则表达式会继续使用或条件从逗号后面的字符继续吗?但是第一个分组表达式在逗号后面的所有数据中仍然有效,因此它可能会将"pqr作为下一个数据?

1个回答

8

因此,字段模式描述如下。

一个不包含逗号的字符串,其长度大于零(不匹配空字符串)

[^,]+

一个以双引号开始和结束,并至少包含一个非双引号字符的字符串(为了方便阅读而省略转义反斜杠):

"[^"]+"      

正则表达式引擎从字符串开头开始匹配,并尝试在给定模式下尽可能多地匹配。

abc,"pqr,mno" 

因此,abc是字符串的开头中与任一模式匹配的最长字符串,因此它成为$1。下一个字符,无法与任一模式匹配,因此正则表达式引擎只是移至下一个字符",从而开始匹配第二个模式。该模式匹配直到行末,因为"pqr,mno"是以双引号开头和结尾,并包含至少一个非双引号字符的字符串。因此,"pqr,mno"成为记录abc,"pqr,mno"$2


3
我的问题是为什么正则表达式从逗号后的第二个模式开始,它总是可以使用 [^,] ,因为数据不包含逗号。由于正则表达式是贪婪的,它只会寻找第一个匹配项,对吗?还是会寻找最长的匹配项? - rahul
1
@user1844303 它将会匹配最长的那个。一个简单的测试是交换这两个正则表达式的顺序。 - Chris Seymour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接