Home About Contact
Sed , GNU , Terminal

sed を使ってHTMLを処理する

sed の正規表現は java などの正規表現とは振る舞いが違う部分があるので注意が必要です。

詳しくは Overview of Regular Expression Syntax を読みましょう。

Mac OS X のターミナルで sed を使う場合、GNU の sed は標準ではインストールされていない、と思われる。 http://ftp.gnu.org/gnu/sed/ 等からダウンロードしてソースからインストールしておくと何かと重宝します。

本題 HTML を sed で処理

たとえば次のようなHTMLコードがあった場合に…

<p>hello world</p><p>hello groovy</p>

最初の p 要素で囲まれた hello world だけ取り出したい場合を考える。

単純なしかし 実際には間違った sed コードは以下のようになる。

s/<p>\(.*\)<\/p>.*/\1/

結果は

hello world</p><p>hello groovy

が取り出される。( cat test.txt | sed -f test.sed のように実行 ) これは 欲張りなマッチルール ( greedy match ) によって p 要素の閉じタグは最初ではなく最後の閉じタグにマッチされてしまう。

そこで、以下のように正規表現を書けば、意図通りに処理できます。

s/<p>\([^<]*\)<\/p>.*/\1/

補足) 以下のように * の代わりに + にした方がよりロバストな気がする。

s/<p>\([^<]\+\)<\/p>.*/\1/