AWK ではこのような場合、以下の 2 通りのやり方があります。
match() は、さらに暗黙の変数 RSTART と RLENGTH もセットし、それぞれ
s="54321" match(s,/[2-4]*/)とすると、RSTART=2, RLENGTH=3 (つまり "432" がマッチした部分) となります。 なお、この正規表現は、
を意味します。 正規表現は最長一致 (なるべく長く一致) しようとしますので、 上のパターンに一致するのは "432" ということになります。 そして、この直後に[2-4]
= 2,3,4 のいずれか、
[2-4]*
= 「2,3,4 のいずれか」の 0 文字以上の連続
c=substr(s,RSTART,RLENGTH)とすれば、 に "432" が保存されるわけです。
さて、
s="<title>タイトル</title>"である場合、この「タイトル」の部分のみを得るには以下のようにすればできます。
この場合は、
sub(/<title>/,"",s) sub(/<\/title>/,"",s)とすると s="タイトル" となります。
この 2 つの sub() は、gsub() を使って 以下のように一つで書くこともできます。
gsub(/<\/?title>/,"",s)
\/?
は \/
が一つあるか、またはない状態を意味します
ので、これで <title>
と </title>
の両方に
マッチすることになります。
この gsub() は、マッチしたものすべてを "" (空文字列) で置きかえますので、
1 回の gsub() で両方が取り除かれることになります。
s の先頭が <title>
で、最後が </title>
であることが
わかっていれば
n1=length("<title>") n2=length("</title>") s1=substr(s,n1+1,length(s)-n1-n2)で取り出すことができます。length(s) は文字列 s の長さを返す関数です。
なお、実際の文字列には <title> や </title> の前後に スペースなどの不要なものがついている可能性もあります。 その場合は、substr() では match() や index() との併用が必要になるでしょう。 例えば以下のような具合です。
if(match(s,/<title>[ \t]*/)) # [ \t] はスペースかタブ s=substr(s,RSTART+RLENGTH) # マッチしたところ以降 if(match(s,/[ \t]*<\/title>/)) s=substr(s,1,RSTART-1) # マッチしたところの手前まで同じことを sub() で行おうとすると以下のようになります。
sub(/.*<title>[ \t]*/,"",s) # .* は任意の文字の 0 文字以上 sub(/[ \t]*<\/title>.*/,"",s)
sub(), gsub() を使う方が簡単そうですが、substr() + match() の場合は その部分文字列が確かに含まれているかどうかのチェックが行える、 というメリットがあります。
今回はまずそれが含まれる文字列に対して処理をしますので チェックは不要ですから、 sub(), gsub() で行うことにします。