[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.)