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

Awkプログラミング言語から

関数sub ( r, s , t )は、最初に、ターゲット文字列t;次に、部分文字列を置換文字列sに置き換えます。

関数sub(r,s)sub(r,s,$0)の同義語です。

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

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

サブ関数は、行われた置換の数を返します。

subの戻り値は0ですか、それとも1ですか。 subは最初の一致を見つけて置き換えるだけなので、「複数にすることはできません」というのは正しいですか?

ありがとうございます。

回答

GNUawkマニュアルから 9.1.3文字列操作関数

sub()の3番目の引数は、変数、フィールド、または配列要素である必要があります。 awkのバージョンでは、3番目の引数を左辺値ではない式にすることができます。このような場合でも、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 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です