awk FPAT变量:工作

ghu*_*b24 6 regex awk gawk

我已经能够从GAWKGNU页面了解到它可以使用FPAT变量处理数据中的分隔符,但我无法理解它是如何工作的.对于CSV文件,FPAT值为:

FPAT = "([^,]+)|(\"[^\"]+\")"
Run Code Online (Sandbox Code Playgroud)

使用数据:

abc,"pqr,mno"
Run Code Online (Sandbox Code Playgroud)

第一个分组表达式计算所有内容,即不是逗号,这应该"abc"是数据,然后第一次出现逗号时失败.现在我的问题是接下来会发生什么?由于第一个分组表达式失败,regexp将继续使用或条件逗号之后的字符?但是第一个分组表达式继续对逗号后的所有数据有效,因此它可能"pqr作为下一个数据?

Chr*_*our 6

因此,场模式描述如下.

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

[^,]+
Run Code Online (Sandbox Code Playgroud)

或者以双引号开头和结尾的字符串,并且包含至少一个不是双引号的字符(为了便于阅读而省略了反斜杠):

"[^"]+"      

正则表达式引擎匹配从字符串的开头,并尝试尽可能匹配给定的模式.

abc,"pqr,mno" 
Run Code Online (Sandbox Code Playgroud)

因此abc,最长的字符串与字符串开头的任一模式匹配,因此变为$1.,任何一种模式都无法匹配下一个字符,因此正则表达式引擎只会移动到下一个字符",其开头与第二个模式匹配.这将匹配到行尾,因为"pqr,mno"字符串以双引号开头和结尾,并且包含至少一个非双引号字符.因此"pqr,mno"成为$2记录abc,"pqr,mno".

  • 我的问题是,为什么正则表达式将从“”的第二个模式开始,它总是可以用于[^,],因为数据不是逗号。由于正则表达式很贪婪,它只会寻找第一个匹配项,对吗?最长的? (2认同)