Awkプログラミング言語から
関数
sub ( r, s , t )
は、最初に、ターゲット文字列t
;次に、部分文字列を置換文字列s
に置き換えます。関数
sub(r,s)
はsub(r,s,$0)
の同義語です。
sub ( /ana/, "anda" , "banana" )
、たとえば、banana
はbandada
に置き換えられます。
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