[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:46201] [Q] sed expression



柏崎@北海道です。

# 全然 debian な話題ではなくて大変申し訳ないですが…
# こういう話題ってどこの ML に投げればいいんだろう。2 ちゃんか ?
# fj なら fj.unix.shell とか fj.comp.lang.shell なんでしょうけど

HTML 文書の中のアンカーが示す URI を sed や awk で一括抽出して、リンク
先のHTML 文書をさらに GET して…みたいな事はよく行われる事かと思います。

で、href="..." の内容が http://... で示される絶対的な URI であれば問題
ないのですが、相対パスで示されていた場合は、他の部分からベースとなる
URI を抽出して来て変数 BASEURIなどに入れ、相対パスと結合させて絶対的な
URI にしてから wget に渡して、といった処理が必要になると思います。

URI を一括抽出して、その結果に対して BASEURIを行頭に結合して、という処
理を実現するために、eval sed 's/^/$BASEURI/' が思いつくのですが、この
場合ですと、例えば BASEURI が http://www.example.com/foobar/ だったと
したら、"/" と "." を "\/" "\." に変換させて sed に入れて eval しなけ
ればいけなくなります。なので、BASEURI に対して

% BASEURI_PATTERN=`echo $BASEDIR | sed 's/\./\\\./g' | sed 's/\//\\\//g'`

のようにすると

sed: 1: "s/\//\\//g": bad flag in substitute command: '/'

と怒られます。`` 内ではなく、普通に

% echo $BASEDIR | sed 's/\./\\\./g' | sed 's/\//\\\//g'

とすると意図した処理が行われるのですが、``で括ると違う挙動になるようで
す。しかも . → \. は怒られないのに / → \/ が怒られるのが分からない。
これについてどなたかご教授頂ければ幸いです。

さらにもう一点としては、そもそも BASEDIR → BASEDIR_PATTERN のような変
換を行って絶対的 URI にする、という手法そのものがスマートじゃないので
はなかろうかという疑問があります。もっと冴えたやり方がありましたら是非
ご教授下さい。

-- 
柏崎 礼生 (Hiroki Kashiwazaki)@HUIST
Research Associate @ Graduate School of Information Science and
Technology, Hokkaido University
mailto:reo@xxxxxxxxxxxxxxxxx
Tel:+81-11-706-2056 (Office), +81-706-2998 (Takai Lab.)