我已经从GNU page of GAWK中了解到,它可以使用FPAT
变量处理数据中的定界符,但我无法弄清其工作原理。对于CSV文件,FPAT值为:
FPAT = "([^,]+)|(\"[^\"]+\")"
使用数据:
abc,"pqr,mno"
第一个分组表达式对所有值求值,即不是逗号,这应该以
"abc"
作为数据,然后在第一次出现逗号时失败。现在我的问题是接下来会发生什么?由于第一个分组表达式失败,使用或条件,正则表达式将从逗号后的字符处继续吗?但是第一个分组表达式对于逗号之后的所有数据仍然有效,因此它可能将"pqr
用作下一个数据? 最佳答案
因此,场模式描述如下。
一个不包含逗号的字符串,该字符串的长度大于零(不匹配空字符串):
[^,]+
或以双引号开头和结尾且包含至少一个不是双引号的字符的字符串(转义时要保留转义的反斜杠):
"[^"]+"
Regular expression engine match from the beginning of the string and try to match as much as possible given the patterns.
abc,"pqr,mno"
因此,
abc
是从字符串开头通过任一模式匹配的最长字符串,因此成为$1
。下一个字符,
不能通过任何一个模式进行匹配,因此正则表达式引擎将移至下一个字符"
并开始与第二个模式匹配。匹配到行尾为止,因为"pqr,mno"
是一个以双引号开头和结尾的字符串,并且至少包含一个非双引号字符。因此,"pqr,mno"
成为记录$2
的abc,"pqr,mno"
。