2012-04-11 4 views
0

私はこのような外観のfeed.xmlファイルを持っています。私がしたいのは、このフィードからtest.htmlを取得することです(基本的に、一番上のアイテムのURLです)。これを行う方法についての考えはありますか?2つの文字列の最初の出現の間にテキストを取得する[シェル]

<rss> 
<item> 
    <title>ABC</title> 
    <url> 
     test.html 
    </url> 
</item> 
<item> 
    <title>CDE</title> 
    <url> 
     test1.html 
    </url> 
</item> 
</rss> 

ありがとう!

+2

あなたが唯一のシェルでやりたいのはなぜ?いくつかのXMLパーサを使う方がいいです。 – anubhava

+0

非常に大きなポストビルドスクリプトの一部であり、残念ながらシェルで実行する必要があります。 – user754905

+1

スクリプトでXMLパーサを使用するプログラムを起動させます。本当に。 http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – geekosaur

答えて

1

構造を固定し、そのURLを知っている場合は接尾辞.htmlがある場合は、次のようにします。

あなたは接尾(または文字列「HTML」の前に存在することができますが)わからない場合

、あなたが行うことができます:

cat <yourfile> | grep -A1 "<url>" | head -n2 | tail -n1 

はEDIT場合 は、構造が固定されていない(すなわち、無改行しない)、そこにこの

cat <yourfile> | grep -o "<url>[^<]*</url>" | head -n1 | cut -d'>' -f2 | cut -d'<' -f1 

またはその

cat <yourfile> | grep -o "<url>[^<]*</url>" | head -n1 | sed -E -e"s#<url>(.*)</url>#\1#" 

が動作する可能性があります。

+0

。ファイルは正確に上記のポストのように見える場合は、ない改行文字がない場合HTMLのものが正常に動作します: ABC test.htmlという CDE test1.html、それは動作しません。 – user754905

+0

それは私がwhith '固定構造'を意味したものです。私はこの場合の答えを編集しました。 – Matthias

+0

Catの役に立たない使用; http://partmaps.org/era/unix/award.html – tripleee

0

このawkスクリプトは動作するはずです:

awk '/<url>/ && url==0 {url=1;next;} {if(url==1) {print;url=2;}}' file 

はEDIT:grepコマンドに続いて

もうまくいくかもしれない:

grep -m 1 "^ *<url>" -A1 file | grep -v "<url>" 
+0

タグが user754905

+0

のように見える場合は、 'を両方のコマンドで' 'と置き換えます。 – anubhava

0

ラインベースのツールを使用する代わりに、書式設定方法を前提にせずに、xslトランスフォームを使用してドキュメントから必要なデータを取得することをお勧めします。

あなたはget-url.xslにこれを保存する場合:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
     <xsl:output method="text"/> 
     <xsl:template match="/"> 
        <xsl:value-of select="normalize-space(rss/item/url)"/> 
     </xsl:template> 
</xsl:stylesheet> 

を次にあなたがこのようfeed.xmlからurlの値を取得することができます

$ xsltproc get-url.xsl feed.xml; echo 
test.html 
$ 

余分echoは後にあなたに改行を与えることだけであり出力の終わりで、対話的なシェルとして使いやすくなりました。あなたが$()というシェル変数に結果を代入するのであれば、それを削除してください。

+0

@glennjackman @glennjackmanは入力しないでください。 – je4d

+0

URLタグが user754905

+0

@ user754905に置き換えられた場合、どのようにxslを作成しますか?入力に ' 'ならば、入力のルート要素は属性' xmlns:bundle = "..." 'を含むべきです。 'xmlns:bundle =" ... "属性をxslのルート要素(つまり' xsl:stylesheet'要素)にコピーし、 'rss/item/url'を' rss/item 'に置き換える必要があります/ bundle:releaselink'と入力します。 – je4d

1

これはあなたのために働くかもしれない:

sed '/<url>/,/<\/url>/{//d;s/ *//;q};d' file.xml 
+0

エラー:sed:1: "/ /、/ <\/url>/{// d; s ...":qコマンドの末尾に余分な文字があります – user754905

+0

私はなぜ古いバージョン'sed -e '/ /、/ <\/url> /!d' -e '// d' -e '/ * //' -e 'q'ファイル' – potong

+0

返信する返信する – user754905

関連する問題