awkで `sub`を実行した後に新しい文字列を取得できる場所

awkで `sub`を実行した後に新しい文字列を取得できる場所

awkプログラミング言語で

この関数は、最初に sub ( r, s , t ) 正規表現に一致するターゲット文字列の一番左にある部分文字列を見つけ、その部分文字列を代替文字列に置き換えます。 rts

この機能sub(r,s)はの同義語です sub(r,s,$0)

sub ( /ana/, "anda" , "banana" )たとえば、inは bananaに置き換えられますbandada

実行後にsub ( r, s , t )新しい文字列を取得する方法は?たとえば、からsub ( /ana/, "anda" , "banana" )新しい文字列を取得するにはどうすればよいですかbandada

sub関数は置き換えられた回数を返します。

sub0または1が返されますか?sub最初の一致のみを見つけて置き換えるため、複数にすることはできません。これは正しいですか?

ありがとうございます。

答え1

GNU awkマニュアルから9.1.3 文字列演算関数:

...3番目の引数はsub()変数、フィールド、または配列要素でなければなりません。一部のawkバージョンでは、3番目の引数はlvalueではなく式を受け入れます。この場合もsub()パターンを検索して 0 または 1 を返しますが、代替結果 (存在する場合) を入れる位置がないため削除されます。このバージョンのawkでは、次のような表現が可能です。

sub(/USA/, "United States", "the USA and Canada")

記録の互換性のために、gawkはこれらのエラーコードを受け入れます。しかし、他の不変オブジェクトを3番目の引数として使用すると、致命的なエラーが発生し、プログラムは実行されません。

したがって、答えは変数を使用することです。

awk 'BEGIN{t = "banana"; sub(/ana/,"anda",t); print t}'
bandana

関連情報