講座「文系のためのawkプログラミング入門」
前回見た関数は、文字列についての情報を教えてくれるものでしたが、今回紹介する関数は、文字列に対して、その一部分を切り出したり、特定の語句を別の語句と取り替えたり(置換)という、加工を行ないます。
substrは、次の様に引数を三つも持つ、ちょっと複雑な関数です。仕事はある文字列から部分文字列を切り出すことです。
substr(str,beg,len)
str : 文字列…切り出しの対象になる元の文字列
beg : 整数値(バイト単位)… 切り出しの開始位置
len : 整数値(バイト単位)… 切り出す文字列の長さ
返値: 文字列
引数に与えられた文字列( str )の beg 文字目から len 文字分切り出して、切り出した文字列を返してくれます。ここで文字はバイト単位で数えることに注意してください。また、切り出す文字の位置を数えるときは、最初の文字を1バイト目として数えます。与える引数は三つで、順序を間違えないようにしないといけません。例をあげましょう。次のスクリプトを実行してください。
# script 9-1 BEGIN{ str = substr("programming",4,5) print "str = " str }
str には "gramm" という文字列が切り出されて入っていることがわかりますね。
この関数に与える引数は変数でもかまいません。
# script 9-2 BEGIN{ str = "内閣総理大臣" beg = 5 len = 4 str = substr(str,beg,len) print "str = " str }
上の例のように、日本語の漢字やかな、記号は1文字2バイトとして数えることを忘れてはいけません。スクリプト 8-2 の実行結果はどうなるか予測してください。また実際に実行してください。
sub と gsub は文字列を置換します。
sub(r, s, str)
r :置換する元の部分文字列(正規表現)
s :新しい文字列
str :全体の文字列
返値:整数値(置換した回数だが、この場合は常に1)
sub は ある文字列(str)の中から、正規表現で表された部分文字列(r)を探し出して、それを(s)に置換します。置換は最初に正規表現に適合する部分に対してだけ、一回だけ行なわれます。
続いて、gsub も見ておきます。これは sub と動作は同じですが、置換は、正規表現に適合する全ての部分を置換します。
gsub(r, s, str)
r :置換する元の部分文字列(正規表現)
s :新しい文字列
str :全体の文字列
返値:整数値(置換した回数)
実際にスクリプトで試して見ましょう。
# script 9-3 BEGIN{ print "---- 最初にsub ----" str = "I have a cat and you have a cat." n = sub(/cat/,"dog",str) #/cat/ を "dog" に置換 print n "回置換しました" print "置換した結果 :" str print "---- 次はgsub ----" str = "I have a cat and you have a cat." n = gsub(/cat/,"dog",str) print n "回置換しました" print "置換した結果 :" str }
sub gsub は、最後の引数を省略すれば、現在の入力行、すなわち $0 において置換が行なわれるということも覚えておきましょう。
また、文字列関数の動作は関数によってかなり異なります。たとえば substr の場合は返値は文字列でしたが、sub や gsub の返値は置換した回数を表す整数値です。さらに大きな違いは、substr の場合、引数にした元の文字列から部分文字列を取り出すだけです。元の文字列自体は変わりません。しかし、subやgsubの場合は、置換が行なわれる結果、元の文字列が変ってしまいます。次のスクリプトで確めてください。
# script 9-4 BEGIN{ original = "I love cats." print "substr 実行前の original = " original s = substr(original,3,4) print "substr 実行後の original = " original print "------------" print "sub 実行前の original = " original n = sub(/cat/,"dog",original) print "sub 実行後の original = " original }
こういう文字列関数の動作は、最初のうちは複雑に見えるかもしれません。しかし、何度も使っているうちにしっかり身につくでしょう。