Closed8

match関数の第三引数とは #gawk

hymkorhymkor

gawkを本格的に使おうとすると、match関数を使いこなさないといかんのだけど、この関数はアウトプットをグローバル変数とパラメータの配列への参照と戻り値の3つに出すという酷い仕様なんだよな

hymkorhymkor

gawk の match関数でキャプチャーした部分文字列が格納される配列を入れる第三引数、実は今日まで知らなかったのだけれども、ググってみたら書いてない記事も多い(第二引数までしか書いてない)。比較的新しい仕様なんだろうか…

hymkorhymkor

gawk(1): pattern scanning/processing language - Linux man page より:

match(s, r [, a])

Returns the position in s where the regular expression r occurs, or 0 if r is not present, and sets the values of RSTART and RLENGTH. Note that the argument order is the same as for the ~ operator: str ~ re. If array a is provided, a is cleared and then elements 1 through n are filled with the portions of s that match the corresponding parenthesized subexpression in r. The 0'th element of a contains the portion of s matched by the entire regular expression r. Subscripts a[n, "start"], and a[n, "length"] provide the starting index in the string and length respectively, of each matching substring.

s においてで正規表現 r にマッチする位置を返す。もし存在しなければ 0 を返す。そして(グローバル変数の) RSTART と RLENGTH に値を設定する。引数の順番は ~ (チルダ)と同じである: str ~ re。配列 a が与えられている場合、a はクリアして、要素1~ n は r における対応する括弧式にマッチするsの部分(文字列)で満たされる。添字 a[n,"start"] と a[n,"length"] は、おのおののマッチする部分文字列の開始位置と長さを提供する。

hymkorhymkor

脱線するけど英語表現が勉強になる

  • elements 1 through n : 1~n の要素
  • provide:与える、提供する的な
  • portion:部分(最初 position の綴ミスかと思った。port-ion なのね)
hymkorhymkor

最新の match 関数に対応していて、第三引数もちゃんと記述されている。それだけでなく、@include@load など、俺の知らなかった新機能まで!すごいな「とほほのAWK入門」!
(でも、ライブラリまで使うなら、もう Go とか使ったほうがいいんじゃね?とか思ってしまう。そんなことよりも、改行コードを要素に含む CSV でも読めるようにしてほしいわ)

hymkorhymkor

具体的なバージョンとしては

  • 5.0.0 (git についてきたやつ)- OK
  • 4.2 (「とほほ」で説明されてるやつ)- OK
  • 3.1.5 (たまたま手元にあったやつ)- OK

サポートされてない gawk を探す方が難しいみたい。ちなみに、テスト用のワンライナー

 gawk "BEGIN{ if( match(\"abcdefg\",\"bc(.)\",a)){ print a[1] } }"
hymkorhymkor

gawk changelog match で検索したところ、Feature History (The GNU Awk User’s Guide) という変更履歴のようなページが見つかった。これの

Version 3.1 of gawk introduced the following features:

のところに

The optional third argument to the match() function for capturing text-matching subexpressions within a regexp (see section String-Manipulation Functions).

という記述がある。つまり。gawk 3.1 から実装された機能で間違いなさそうだ。

このスクラップは2022/03/20にクローズされました