2013-10-15 29 views
5

GNU page of GAWKから、FPAT変数を使用してデータの区切り文字を処理できることがわかりましたが、これはどのように機能するのですか? CSVはFPAT値を提出するためには、次のとおりです。awk FPAT変数:作業

データを使用して
FPAT = "([^,]+)|(\"[^\"]+\")" 

:最初のグループ化された式はすなわちすべてではないコンマと評価さ

abc,"pqr,mno" 

データが最初で失敗するように、これは​​を取る必要がありますカンマの出現。今私の質問は次に起こることですか?最初のグループ化された式が失敗したので、正規表現は、または条件を使用してカンマの後の文字から継続しますか?最初のグループ化された式は、コンマの後のすべてのデータに対して有効なままなので、次のデータとして"pqrがかかる可能性がありますか?

答えて

5

したがって、フィールドパターンは以下のように記述されます。

文字列の長さであるコンマを含まないストリングゼロより大きい(空の文字列と一致しません)

[^,]+ 

または出発二重引用符で終了し、少なくとも含む文字列

 
"[^"]+"  

正規表現エンジンのマッチstrinの初めから:二重引用符(エスケープバックスラッシュは読みやすくするために取り残さ)ではありません1つの文字gパターンを考えれば可能な限り一致するようにしてください。

abc,"pqr,mno" 

のでabcは、文字列の先頭からいずれかのパターンにマッチした最も長い文字列であり、したがって$1になります。次の文字,はどちらのパターンでも一致することはできませんので、正規表現エンジンは次の文字"に移動し、2番目のパターンに一致します。これは行末まで一致し、"pqr,mno"は、二重引用符で始まり二重引用符で囲まれた文字列で、二重引用符以外の文字を少なくとも1つ含みます。したがって、"pqr,mno"abc,"pqr,mno"の場合は$2になります。

+1

私の質問は、データがカンマではないため、常に「^」に行くことができるという点で、2番目のパターンから始まるでしょうか?regexpは貪欲であるため、最初の一致を探します。 – ghub24

+0

sudo_Oさん、ありがとうございます。 – ghub24

+0

@ user1844303これは最長の時間になります。簡単なテストは、2つの正規表現の順序を切り替えることです。 –