ग्रीप समतुल्य
आप बैश फ़ंक्शन को परिभाषित कर सकते हैं, "xp" ("xpath") कह सकते हैं जो कुछ python3 कोड को लपेटता है। इसका उपयोग करने के लिए आपको python3 और python-lxml स्थापित करना होगा। लाभ:
- regex मिलान जो आप में कमी है जैसे xmllint।
- कमांड लाइन पर एक फिल्टर (एक पाइप में) के रूप में उपयोग करें
इस तरह उपयोग करना आसान और शक्तिशाली है:
xmldoc=$(cat <<EOF
<?xml version="1.0" encoding="utf-8"?>
<job xmlns="http://www.sample.com/">programming</job>
EOF
)
selection='//*[namespace-uri()="http://www.sample.com/" and local-name()="job" and re:test(.,"^pro.*ing$")]/text()'
echo "$xmldoc" | xp "$selection"
# prints programming
xp () कुछ इस तरह दिखता है:
xp()
{
local selection="$1";
local xmldoc;
if ! [[ -t 0 ]]; then
read -rd '' xmldoc;
else
xmldoc="$2";
fi;
python3 <(printf '%b' "from lxml.html import tostring\nfrom lxml import etree\nfrom sys import stdin\nregexpNS = \"http://exslt.org/regular-expressions\"\ntree = etree.parse(stdin)\nfor e in tree.xpath('""$selection""', namespaces={'re':regexpNS}):\n if isinstance(e, str):\n print(e)\n else:\n print(tostring(e).decode('UTF-8'))") <<< "$xmldoc"
}
सैड समतुल्य
Xq का उपयोग करने पर विचार करें जो आपको jq "प्रोग्रामिंग लैंग्वेज" की पूरी शक्ति प्रदान करता है। यदि आपके पास अजगर-पाइप स्थापित है, तो आप पाइप स्थापित yq के साथ xq स्थापित कर सकते हैं , फिर नीचे उदाहरण में हम "कीप अकाउंट्स" को "कीप अकाउंट्स 2" के साथ बदल रहे हैं:
xmldoc=$(cat <<'EOF'
<resources>
<string name="app_name">Keep Accounts</string>
<string name="login">"login"</string>
<string name="login_password">"password:"</string>
<string name="login_account_hint">input to login</string>
<string name="login_password_hint">input your password</string>
<string name="login_fail">login failed</string>
</resources>
EOF
)
echo "$xmldoc" | xq '.resources.string = ([.resources.string[]|select(."#text" == "Keep Accounts") ."#text" = "Keep Accounts 2"])' -x