第9回文字列関数(2)

講座「文系のためのawkプログラミング入門」

前回見た関数は、文字列についての情報を教えてくれるものでしたが、今回紹介する関数は、文字列に対して、その一部分を切り出したり、特定の語句を別の語句と取り替えたり(置換)という、加工を行ないます。

 II文字列の加工を行なう関数

 1)substr(str,beg,len)

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 の実行結果はどうなるか予測してください。また実際に実行してください。

 2)sub(r,s,str) と gsub(r,s,str)

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
}

こういう文字列関数の動作は、最初のうちは複雑に見えるかもしれません。しかし、何度も使っているうちにしっかり身につくでしょう。


前回 次回 目次 Home