我不太熟悉正規表示式、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
為了理解正規表示式,我們將其分為三個部分:
.*
從行首到第二部分匹配這部分
sunset="([^"]*)"
匹配字符sunset="
,後面跟著任意數量的字符(除了 )"
,最後是結束字符"
。此表達式[^"]
表示除 和 之外的任何字符"
,並且[^"]*
表示任意數量的此類字符。括號捕獲sed 組 1(...)
中的字符,我們稍後將其稱為。"..."
\1
.*
匹配日落表達式之後的所有字元。
答案4
我會給出相同的答案傑里米·科爾但給它一個xml
例子。
我們有一個在out根資料夾中呼叫的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
讀取this的屬性。