次へ: 6 各部分の構成 上へ: AWK による HTML ファイルの整形 前へ: 4 目標となる行の取り出し (PDF ファイル: awkhtml.pdf)


5 必要な部分文字列の取得

4 節では、 必要な部分を行単位で保存する方法について説明しましたが、 この節では、それを文字列として連結した後で、 タグ以外の必要な部分を取得する方法について説明します。 1. の <title>$\sim$</title> の内容の取得などで これを利用しますので、これについて考えてみます。

AWK ではこのような場合、以下の 2 通りのやり方があります。

  1. 必要な部分を含む行の、不要な部分を sub(), gsub() を使って削除する
  2. 必要な部分を含む行の、必要な部分文字列を substr() で取り出す (match() や index() も使用)
使用する関数の意味は以下の通りです。

match() は、さらに暗黙の変数 RSTART と RLENGTH もセットし、それぞれ

となります。例えば、
  s="54321"
  match(s,/[2-4]*/)
とすると、RSTART=2, RLENGTH=3 (つまり "432" がマッチした部分) となります。 なお、この正規表現は、
[2-4] = 2,3,4 のいずれか、
[2-4]* = 「2,3,4 のいずれか」の 0 文字以上の連続
を意味します。 正規表現は最長一致 (なるべく長く一致) しようとしますので、 上のパターンに一致するのは "432" ということになります。 そして、この直後に
  c=substr(s,RSTART,RLENGTH)
とすれば、$c$ に "432" が保存されるわけです。

さて、

  s="<title>タイトル</title>"
である場合、この「タイトル」の部分のみを得るには以下のようにすればできます。
  1. sub(), gsub() を使う場合

    この場合は、

        sub(/<title>/,"",s)
        sub(/<\/title>/,"",s)
    
    とすると s="タイトル" となります。

    この 2 つの sub() は、gsub() を使って 以下のように一つで書くこともできます。

        gsub(/<\/?title>/,"",s)
    
    \/?\/ が一つあるか、またはない状態を意味します ので、これで <title></title> の両方に マッチすることになります。 この gsub() は、マッチしたものすべてを "" (空文字列) で置きかえますので、 1 回の gsub() で両方が取り除かれることになります。

  2. substr() を使う場合

    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() で行うことにします。


次へ: 6 各部分の構成 上へ: AWK による HTML ファイルの整形 前へ: 4 目標となる行の取り出し
竹野茂治@新潟工科大学
2006年8月14日