20

私はxmlファイルからいくつかの情報を抽出するためにbashスクリプトに取り組んでいます。私はgrepこれに使用しています。

必要な情報を見つけるために、次のコマンドを実行します。

grep -oP "<title>(.*)</title>" temp.xml

一致するもののリストを取得しました。これには<title>タグが含まれています。

grepを使用して、タグ内のテキストのみtitle含み、タグを含まないリストを取得するにはどうすればよいですか?title

4

6 に答える 6

37

すでに使っているのでgrep -P、その機能を使ってみませんか?

grep -oP '(?<=<title>).*?(?=</title>)'

一般的なケースでは、XPathが正しい解決策ですが、おもちゃのシナリオでは、そうです、バージニア州では、それを行うことができます。

于 2012-05-28T10:50:58.623 に答える
8

簡単なXPath式で解決できるのに、なぜこれにgrepを使用したいかわかりません。

//title/text()

XPathには多くのコマンドラインツールがあり、通常はOSにバンドルされています。

Stack Overflowでのこの質問への回答には、そのようなツールがいくつかリストされています。

ここでの問題grepは、これがテキスト処理用の汎用ツールであり、XML構造を認識しないことです。非常に単純なシナリオでは、それを機能させることができます。ドキュメントが複雑な場合、または1回限りの作業だけでなく、数か月または数年も存続するスクリプトでこれを使用している場合は、結果を気の毒に思う可能性があります。

XPathを使用すると、ドキュメント内のさまざまなコンテキストに表示される同様の名前のタグの違いを簡単に見分けることができます。

<article>
    <author>
        <name>Jon Doe</name>
        <title>Chief Editor</title>
    </author>
    <title>On the Benefits of grep</title>
    <publicationDate>2018-02-12</publicationDate>
    <text>blah blah blah</text>
</article>

grepここに投稿された他の回答のいずれかを使用した場合、このドキュメントで表される記事のタイトルを抽出すると失敗します。技術的には正規表現を記述して必要なものを取得できますが、XPathを使用するとはるかに簡単になります。

/article/title/text()

些細なドキュメントを扱っていて、形式が変わらないことがわかっている場合、または結果をすばやく検証できる1回限りの作業である場合は、他のgrep人が説明しているように進むことができます。

于 2012-05-28T09:55:08.573 に答える
5

これは最善の解決策ではありません。bashでXMLlibを検索しますが、次のことができます。

grep -oP "<title>(.*)</title>" temp.xml | cut -d ">" -f 2 | cut -d "<" -f 1
于 2012-05-28T09:10:18.760 に答える
2
grep -oP "<foo>(.*)</foo>" "XML.xml" | sed -n 's/.*<foo>\([^<]*\)<\/foo>.*/\1/p' >> "foo.txt"
于 2019-01-16T06:17:11.343 に答える
1

Tomの回答で提案されているように、xpathを使用してxgrepをインストールできます。

男xgrep

于 2013-02-11T15:25:50.793 に答える
0

以下のコマンドのいずれかを使用して、タグ間の値を取得できます。

grep -oP '(>).*?(?=</title>)' test.xml | cut -d ">" -f 2
grep -oP '(?<=title>).*(?=</title)' test.xml
awk -F "[><]" '/title/{print $3}' test.xml

于 2021-02-27T02:01:21.930 に答える