私はxmlファイルからいくつかの情報を抽出するためにbashスクリプトに取り組んでいます。私はgrep
これに使用しています。
必要な情報を見つけるために、次のコマンドを実行します。
grep -oP "<title>(.*)</title>" temp.xml
一致するもののリストを取得しました。これには<title>
タグが含まれています。
grepを使用して、タグ内のテキストのみをtitle
含み、タグを含まないリストを取得するにはどうすればよいですか?title
すでに使っているのでgrep -P
、その機能を使ってみませんか?
grep -oP '(?<=<title>).*?(?=</title>)'
一般的なケースでは、XPathが正しい解決策ですが、おもちゃのシナリオでは、そうです、バージニア州では、それを行うことができます。
簡単な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
人が説明しているように進むことができます。
これは最善の解決策ではありません。bashでXMLlibを検索しますが、次のことができます。
grep -oP "<title>(.*)</title>" temp.xml | cut -d ">" -f 2 | cut -d "<" -f 1
grep -oP "<foo>(.*)</foo>" "XML.xml" | sed -n 's/.*<foo>\([^<]*\)<\/foo>.*/\1/p' >> "foo.txt"
以下のコマンドのいずれかを使用して、タグ間の値を取得できます。
grep -oP '(>).*?(?=</title>)' test.xml | cut -d ">" -f 2
grep -oP '(?<=title>).*(?=</title)' test.xml
awk -F "[><]" '/title/{print $3}' test.xml