私は正規表現や sed などにあまり詳しくなく、今すぐに理解するのも面倒なので、この行をどのように抽出すればよいでしょうか。
<yweather:astronomy sunrise="6:50 am" sunset="7:06 pm"/>
さらに XML 構造が必要な場合はお知らせください。
答え1
入力データ (XML ファイル) は構造化されているため、プレーンテキストとして扱い、正規表現を使用するよりも、その構造化データに対してクエリを使用する方が適切です。
xmllint --xpath
XML 入力に対して XPath 式を評価するために使用できます。
$ xmllint --xpath 'string(rss/channel/*[local-name()="astronomy"]/@sunrise)' weather.xml
6:48 am
- ファイル内のさまざまな名前空間を処理する必要があるため、これは少し複雑ですが、それでも機能します。
XPathの詳細については、仕様をご覧ください。http://www.w3.org/TR/xpath/
答え2
正規表現や sed は使用しません。XML パーサーと XML クエリ言語 (XPath または XQuery) を使用します。また、詳細はコンテキストによって異なります。たとえば、「yweather」は名前空間の短縮名 (プレフィックス) であり、それがどの名前空間を表すかを知る必要があります。
答え3
Michael Kay 氏が言うように、正しい答えは XML 専用のツールを使用することです。
手っ取り早い解決策として、sed アプローチがあります。まずはこのファイルから始めましょう:
$ cat file
<yweather:astronomy sunrise="6:50 am" sunset="7:06 pm"/>
日没時刻を抽出するには:
$ sed -rn 's/.*sunset="([^"]*)".*/\1/p' file
7:06 pm
正規表現を理解するために、3 つの部分に分解してみましょう。
.*
行の先頭から2番目の部分まで一致しますこの部分 は、
sunset="([^"]*)"
文字 にsunset="
、 を除く任意の数の文字が続き"
、その後に閉じ が続くものに一致します"
。式 は[^"]
を除く任意の文字を意味し"
、は[^"]*
そのような文字の任意の数を意味します。括弧 は、(...)
内の文字を"..."
sed のグループ 1 にキャプチャします。これは後で として参照されます\1
。.*
sunset 表現の後のすべての文字と一致します。
答え4
私も同じ答えをしますジェレミー・カーしかし、xml
例を挙げて説明します。
ルート フォルダーにxml ファイルがありconfig.xml
、タグの属性またはプロパティ (タグとする) を読み取りたいとしますwidget
。
config.xml
:
<?xml version='1.0' encoding='utf-8'?>
<widget android-versionCode="16" id="co.app.world" ios-CFBundleVersion="0.1.3" version="3.0.5" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>AppName</name>
<description>Description.</description>
<author email="hi@ionicframework" href="http://ionicframework.com/">Ionic Framework Team</author>
</widget>
プロパティ値を取得するにはandroid-versionCode
、ターミナルに次のように入力します。
xmllint --xpath "string(//*[local-name()='widget']/@android-versionCode)" config.xml
出力:
16
説明:タグ/*[local-name()='widget']
をマップしwidget
、@android-versionCode
そのプロパティを読み取るために使用します。