逆参照をサポートしていないPOSIX awkを使用して一致する値を「断片化する」方法

逆参照をサポートしていないPOSIX awkを使用して一致する値を「断片化する」方法

入力が与えられると、例えば次のようになります。

input value #001 is [342]
input value #002 is [8349]

出力が次のようになるように[...]内の値をどのように抽出しますか?

342
8349

これは、逆参照をサポートする正規表現(例: "\ 1")の場合は簡単です。ただし、EREを使用するPOSIX awkはそれをサポートしていません。

たとえば、POSIX sedは逆参照をサポートしているため、次のようになります。

<input sed -E 's/^.*\[([[:digit:]]+)\].*$/\1/'

POSIX awkでこれを行うにはどうすればよいですか?

ベストアンサー1

whichを使用して一致の開始と長さをmatch()設定できます(一致する項目がない場合は;または0を返します)。RSTARTRLENGTHRSTART

awk 'match($0, /\[[[:digit:]]+\]/) {
       print substr($0, RSTART, RLENGTH)
     }'

または:

awk 'match($0, /\[[[:digit:]]+\]/) {
       print substr($0, RSTART+1, RLENGTH-2)
     }'

括弧なしで数字だけを望む場合。

mawk は POSIX 文字クラスをサポートしておらず、[[:digit:]]一部のシステムの一部のロケールでは 0123456789 よりも多くの 10 進数と一致します。[0123456789]ではなく、これらのみを一致させるには、を[0-9]使用してください。

[digits]行に複数の項目がある場合、このawkコードは最初の項目を返し、バリアントは最後の項目を返します(sed貪欲のため)。.*

おすすめ記事