दिलचस्प पोस्ट
टाइप स्क्रिप्ट नियंत्रक और कोणीय जेएस का उपयोग करके डेटा को कैसे बाँटें लाइन से NSFileHandle लाइन से डेटा कैसे पढ़ा जाए? उत्कृष्ट उपयोग करने के लिए देर से बंधन का उपयोग कैसे करें? मैं PowerShell में एक सीएसवी फ़ाइल से एक लाइन के माध्यम से कैसे लूप करूँ? क्या मुझे ईएवी मॉडल का उपयोग करना चाहिए? तालिका-डेटा से तालिका-नाम प्राप्त करें, LINQ DataContext Windows मेजबान फ़ाइल में पोर्ट संख्या का उपयोग करना सी प्रीप्रोसेसर में थोड़ी देर लूप लेखन C, C ++, और C # में शून्य का क्या अर्थ है? JSON को सरणी कन्वर्ट करें कैसे चेक करें कि क्या चेकबॉक्स को चेक किया गया है jQuery में? क्या मैं गिट में हटाने के बाद एक शाखा पुनः प्राप्त कर सकता हूं? त्रुटि सलाखों के साथ स्कैटर साजिश file_get_contents ("php: // इनपुट") या $ HTTP_RAW_POST_DATA, जो कि JSON अनुरोध के शरीर को प्राप्त करना बेहतर है? खंड में गैर-डिफ़ॉल्ट कन्स्ट्रक्टर त्रुटि

कैसे बैश में एक्सएमएल को पार्स करना है?

आदर्श रूप से, मैं क्या करने में सक्षम होना चाहता हूं:

cat xhtmlfile.xhtml | getElementViaXPath --path='/html/head/title' | sed -e 's%(^<title>|</title>$)%%g' > titleOfXHTMLPage.txt 

वेब के समाधान से एकत्रित समाधान "कैसे बैश में एक्सएमएल को पार्स करना है?"

वास्तव में ये यूज़ेम के उत्तर का केवल एक व्याख्यान है , लेकिन मुझे नहीं लगता कि यह किसी और के साथ किया जाना चाहिए, और टिप्पणियां प्रारूपण की अनुमति नहीं देती हैं, इसलिए …

 rdom () { local IFS=\> ; read -d \< EC ;} 

चलो "read_dom" को "rdom" के बजाय कहते हैं, इसे थोड़ा सा स्थान दें और अधिक चर का उपयोग करें:

 read_dom () { local IFS=\> read -d \< ENTITY CONTENT } 

ठीक है, यह read_dom नामक फ़ंक्शन को परिभाषित करता है पहली पंक्ति आईएफएस (इनपुट फ़ील्ड विभाजक) इस फ़ंक्शन में स्थानीय बनाती है और इसे> में बदलती है इसका मतलब है कि जब आप अंतरिक्ष, टैब या नई लाइनों पर स्वतः विभाजित होने के बजाय डेटा पढ़ते हैं तो यह '>' पर विभाजित हो जाता है अगली पंक्ति stdin से इनपुट पढ़ने के लिए कहती है, और एक नई लाइन पर रोक देने के बजाय, जब आप एक '<' चरित्र (डीडीएमएनेटर ध्वज के लिए -d) देखते हैं तो रोकें। तब पढ़ा जाता है IFS का उपयोग करके विभाजित किया जाता है और चर ENTITY और CONTENT को निर्दिष्ट किया जाता है। तो निम्न करें:

 <tag>value</tag> 

read_dom पहली कॉल को खाली स्ट्रिंग read_dom (चूंकि '<' पहला अक्षर है)। यह आईएफएस द्वारा सिर्फ '' में विभाजित हो जाता है, चूंकि कोई '>' चरित्र नहीं है फिर पढ़ें दोनों चर के लिए एक खाली स्ट्रिंग असाइन करता है। दूसरी कॉल को स्ट्रिंग 'टैग' मान मिलता है आईएफएस द्वारा दो फ़ील्ड 'टैग' और 'वैल्यू' में विभाजित किया जाता है। पढ़ें तो चर को असाइन करें जैसे: ENTITY=tag और CONTENT=value । तीसरा कॉल स्ट्रिंग '/ टैग>' हो जाता है आईएफएस द्वारा दो फ़ील्ड '/ टैग' और '' में विभाजित किया जाता है। पढ़ें तो इस तरह के चर को निर्दिष्ट करें: ENTITY=/tag और CONTENT= । चौथा कॉल एक गैर-शून्य स्थिति वापस करेगा क्योंकि हम फ़ाइल के अंत तक पहुंच चुके हैं।

अब जबकि उसका लूप ऊपर से मिलान करने के लिए थोड़ा सा साफ था:

 while read_dom; do if [[ $ENTITY = "title" ]]; then echo $CONTENT exit fi done < xhtmlfile.xhtml > titleOfXHTMLPage.txt 

पहली पंक्ति बस कहती है, "जबकि read_dom फ़ंक्शन शून्य स्थिति को वापस करता है, तो निम्न करें।" दूसरी पंक्ति यह जांचती है कि यदि हमने अभी देखा है उस इकाई "शीर्षक" है अगली पंक्ति टैग की सामग्री का स्थान देती है। चार लाइन निकलती है यदि यह शीर्षक इकाई नहीं है तो छठे पंक्ति पर लूप दोहराता है। हम "xhtmlfile.xhtml" को मानक इनपुट में read_dom ( read_dom फ़ंक्शन के लिए) और मानक आउटपुट को "titleOfXHTMLPage.txt" (पहले लूप में से प्रतिध्वनि) पर रीडायरेक्ट करते हैं।

अब input.xml लिए निम्नलिखित (एस 3 पर एक बाल्टी सूचीबद्ध करने से मिलती-जुलती है) के समान दिया गया:

 <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Name>sth-items</Name> <IsTruncated>false</IsTruncated> <Contents> <Key>item-apple-iso@2x.png</Key> <LastModified>2011-07-25T22:23:04.000Z</LastModified> <ETag>&quot;0032a28286680abee71aed5d059c6a09&quot;</ETag> <Size>1785</Size> <StorageClass>STANDARD</StorageClass> </Contents> </ListBucketResult> 

और निम्न लूप:

 while read_dom; do echo "$ENTITY => $CONTENT" done < input.xml 

आपको मिलना चाहिये:

  => ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/" => Name => sth-items /Name => IsTruncated => false /IsTruncated => Contents => Key => item-apple-iso@2x.png /Key => LastModified => 2011-07-25T22:23:04.000Z /LastModified => ETag => &quot;0032a28286680abee71aed5d059c6a09&quot; /ETag => Size => 1785 /Size => StorageClass => STANDARD /StorageClass => /Contents => 

तो अगर हम यूज़ेम की तरह एक लूप लिखते हैं:

 while read_dom; do if [[ $ENTITY = "Key" ]] ; then echo $CONTENT fi done < input.xml 

हम एस 3 बाल्टी में सभी फाइलों की सूची प्राप्त करेंगे।

संपादित करें यदि किसी वजह से local IFS=\> आपके लिए काम नहीं करता है और आप इसे विश्व स्तर पर सेट करते हैं, तो आपको फ़ंक्शन के अंत में इसे रीसेट करना चाहिए:

 read_dom () { ORIGINAL_IFS=$IFS IFS=\> read -d \< ENTITY CONTENT IFS=$ORIGINAL_IFS } 

अन्यथा, स्क्रिप्ट में आप बाद में जो रेखा विभाजन करेंगे वह गड़बड़ हो जाएगा।

2 संपादित करें गुण नाम / मूल्य जोड़े को विभाजित करने के लिए आप read_dom() को इतना बढ़ा सकते हैं:

 read_dom () { local IFS=\> read -d \< ENTITY CONTENT local ret=$? TAG_NAME=${ENTITY%% *} ATTRIBUTES=${ENTITY#* } return $ret } 

फिर अपना फ़ंक्शन पार्स करने के लिए लिखें और जिस तरह से आप चाहें डेटा प्राप्त करें:

 parse_dom () { if [[ $TAG_NAME = "foo" ]] ; then eval local $ATTRIBUTES echo "foo size is: $size" elif [[ $TAG_NAME = "bar" ]] ; then eval local $ATTRIBUTES echo "bar type is: $type" fi } 

तब जब आप read_dom कॉल parse_dom :

 while read_dom; do parse_dom done 

फिर निम्नलिखित उदाहरण मार्कअप दिया गया है:

 <example> <bar size="bar_size" type="metal">bars content</bar> <foo size="1789" type="unknown">foos content</foo> </example> 

आपको यह आउटपुट प्राप्त करना चाहिए:

 $ cat example.xml | ./bash_xml.sh bar type is: metal foo size is: 1789 

3 को संपादित करें और एक अन्य यूजर ने कहा कि उन्हें इसके बारे में फ्रीबीएसडी में समस्या हो रही है और पढ़ा जाने के बाद इसे पढ़ने और पढ़ने के बाद से बाहर निकलने की स्थिति का सुझाव दिया गया है:

 read_dom () { local IFS=\> read -d \< ENTITY CONTENT local RET=$? TAG_NAME=${ENTITY%% *} ATTRIBUTES=${ENTITY#* } return $RET } 

मुझे कोई कारण नहीं दिखता है कि उसे काम क्यों नहीं करना चाहिए

आप ऐसा कर सकते हैं जो केवल आसानी से केवल बाश का उपयोग कर रहे हैं। आपको केवल यह फ़ंक्शन जोड़ना होगा:

 rdom () { local IFS=\> ; read -d \< EC ;} 

अब आप पढ़ सकते हैं जैसे rdom का उपयोग कर सकते हैं लेकिन HTML दस्तावेज़ों के लिए। जब रोमन कहा जाता है तो वेरिएबल ई और सामग्री को वरीयता सी के लिए तत्व प्रदान करेंगे।

उदाहरण के लिए, जो करना आप करना चाहते थे:

 while rdom; do if [[ $E = title ]]; then echo $C exit fi done < xhtmlfile.xhtml > titleOfXHTMLPage.txt 

कमांड लाइन उपकरण जो कि शेल लिपियों से कहा जा सकता है, इसमें शामिल हैं:

  • 4xpath – पायथन के 4 सूइट पैकेज के चारों ओर कमांड लाइन आवरण
  • XMLStarlet
  • xpath – पर्ल के XPath पुस्तकालय के चारों ओर कमांड लाइन आवरण
  • Xidel – यूआरएल के साथ ही फ़ाइलों के साथ काम करता है JSON के साथ भी काम करता है

मैं एक्सएमएलआईटी और एक्सएसएलटीप्रोक का उपयोग एक्सएमएल ट्रांसफ़ॉर्म स्क्रिप्ट के साथ करता हूं ताकि कमांड लाइन या शेल लिपियों में XML प्रसंस्करण हो।

आप xpath सुविधा का उपयोग कर सकते हैं यह Perl XML-XPath पैकेज के साथ स्थापित है।

उपयोग:

 /usr/bin/xpath [filename] query 

या XMLStarlet इसे खोलने के उपयोग पर स्थापित करने के लिए:

 sudo zypper install xmlstarlet 

या अन्य प्लेटफार्मों पर cnf xml प्रयास करें

XML2 को http://www.ofb.net/~egnor/xml2/ से देखें, जो एक्सएमएल को एक रेखा-उन्मुख स्वरूप में परिवर्तित करता है।

एक अन्य कमांड लाइन टूल मेरा नया Xidel है यह XPath 2 और XQuery का भी समर्थन करता है, जो पहले से उल्लेख किया गया xpath / xmlstarlet के विपरीत है

शीर्षक इस तरह पढ़ा जा सकता है:

 xidel xhtmlfile.xhtml -e /html/head/title > titleOfXHTMLPage.txt 

और यह भी एक शानदार विशेषता है कि कई चर को निर्यात करने के लिए बाश। उदाहरण के लिए

 eval $(xidel xhtmlfile.xhtml -e 'title := //title, imgcount := count(//img)' --output-format bash ) 

$title और फ़ाइल में छवियों की संख्या के लिए $imgcount सेट करता है, जो इसे सीधे $imgcount में पार्स करने के लिए लचीला होना चाहिए।

यह पर्याप्त है …

 xpath xhtmlfile.xhtml '/html/head/title/text()' > titleOfXHTMLPage.txt 

मुझे किसी भी शुद्ध शेल XML पार्सिंग टूल के बारे में पता नहीं है। तो आपको सबसे ज्यादा किसी अन्य भाषा में लिखे गए उपकरण की आवश्यकता होगी।

मेरा XML :: xml_grep पर्ल मॉड्यूल ऐसे उपकरण के साथ आता है: xml_grep , जहां आप शायद लिखेंगे कि आप xml_grep -t '/html/head/title' xhtmlfile.xhtml > titleOfXHTMLPage.txt रूप में क्या चाहते हैं ( -t विकल्प आपको देता है xml के बजाय पाठ के रूप में परिणाम)

ठीक है, आप xpath सुविधा का उपयोग कर सकते हैं मुझे लगता है कि Perl का XML :: Xpath इसमें शामिल है।

लिनक्स और एक्सएमएल फाइलों में फ़ाइल पथों के विंडोज स्वरूपों के बीच अनुवाद के लिए कुछ शोध के बाद मुझे दिलचस्प ट्यूटोरियल और समाधान मिलते हैं:

  • XPaths के बारे में सामान्य जानकारी
  • अमारा – एक्सएमएल के लिए पायथनिक टूल्स का संग्रह
  • 4 सुइट के साथ अजगर / एक्सएमएल का विकास (2 भाग)

युसुम की पद्धति में सुधार किया जा सकता है < और > rdom समारोह में संकेत और वैरिएबल असाइनमेंट के क्रम में, ताकि:

 rdom () { local IFS=\> ; read -d \< EC ;} 

हो जाता है:

 rdom () { local IFS=\< ; read -d \> CE ;} 

यदि पार्सिंग ऐसा नहीं किया जाता है, तो XML फ़ाइल में अंतिम टैग कभी तक नहीं पहुंचा जा सकता है। यह समस्याग्रस्त हो सकता है यदि आप लूप के अंत में एक और एक्सएमएल फ़ाइल को आउटपुट करना चाहते हैं

चाड के उत्तर से शुरू करते हुए, यूएमएल को पार्स करने के लिए पूरी तरह से काम कर रहे समाधान है, जिसमें टिप्पणी के प्रचालक हैंडलिंग के साथ, सिर्फ 2 छोटे फ़ंक्शन (2 से अधिक बू, आप उन सभी को मिला सकते हैं)। मैं यह नहीं कहूंगा कि चाड का कोई भी काम नहीं कर रहा है, लेकिन बुरी तरह से बनाई गई XML फाइलों के साथ बहुत अधिक समस्याएं हैं: इसलिए आपको टिप्पणियां और गलत जगह / सीआर / टैब / आदि को संभालने के लिए थोड़ा अधिक मुश्किल होनी चाहिए।

इस उत्तर का उद्देश्य पर्ल, अजगर या कुछ और का उपयोग करते हुए जटिल टूल के बिना यूएमएल को पार्स करने के लिए किसी के लिए बॉक्स बाश फ़ंक्शंस से तैयार 2 उपयोग देना है। मेरे लिए, मैं cpan स्थापित नहीं कर सकता, न ही पुराना मॉड्यूल जो पुराने ओएस पर काम कर रहा है, और अजगर उपलब्ध नहीं है।

सबसे पहले, इस पोस्ट में इस्तेमाल यूएमएल शब्द की एक परिभाषा:

 <!-- comment... --> <tag attribute="value">content...</tag> 

संपादित करें: संभाल के साथ अद्यतन फ़ंक्शन:

  • वेबस्पेयर xml (xmi और xmlns विशेषताएँ)
  • 256 रंगों के साथ एक संगत टर्मिनल होना चाहिए
  • ग्रे के 24 रंगों
  • आईबीएम एएक्स बाश 3.2.16 (1) के लिए संगतता जोड़ा गया

फ़ंक्शंस, पहले xml_read_dom है जिसे पुनरावर्ती xml_read द्वारा कहा जाता है:

 xml_read_dom() { # https://stackoverflow.com/questions/893585/how-to-parse-xml-in-bash local ENTITY IFS=\> if $ITSACOMMENT; then read -d \< COMMENTS COMMENTS="$(rtrim "${COMMENTS}")" return 0 else read -d \< ENTITY CONTENT CR=$? [ "x${ENTITY:0:1}x" == "x/x" ] && return 0 TAG_NAME=${ENTITY%%[[:space:]]*} [ "x${TAG_NAME}x" == "x?xmlx" ] && TAG_NAME=xml TAG_NAME=${TAG_NAME%%:*} ATTRIBUTES=${ENTITY#*[[:space:]]} ATTRIBUTES="${ATTRIBUTES//xmi:/}" ATTRIBUTES="${ATTRIBUTES//xmlns:/}" fi # when comments sticks to !-- : [ "x${TAG_NAME:0:3}x" == "x!--x" ] && COMMENTS="${TAG_NAME:3} ${ATTRIBUTES}" && ITSACOMMENT=true && return 0 # http://tldp.org/LDP/abs/html/string-manipulation.html # INFO: oh wait it doesn't work on IBM AIX bash 3.2.16(1): # [ "x${ATTRIBUTES:(-1):1}x" == "x/x" -o "x${ATTRIBUTES:(-1):1}x" == "x?x" ] && ATTRIBUTES="${ATTRIBUTES:0:(-1)}" [ "x${ATTRIBUTES:${#ATTRIBUTES} -1:1}x" == "x/x" -o "x${ATTRIBUTES:${#ATTRIBUTES} -1:1}x" == "x?x" ] && ATTRIBUTES="${ATTRIBUTES:0:${#ATTRIBUTES} -1}" return $CR } 

और दूसरा:

 xml_read() { # https://stackoverflow.com/questions/893585/how-to-parse-xml-in-bash ITSACOMMENT=false local MULTIPLE_ATTR LIGHT FORCE_PRINT XAPPLY XCOMMAND XATTRIBUTE GETCONTENT fileXml tag attributes attribute tag2print TAGPRINTED attribute2print XAPPLIED_COLOR PROSTPROCESS USAGE local TMP LOG LOGG LIGHT=false FORCE_PRINT=false XAPPLY=false MULTIPLE_ATTR=false XAPPLIED_COLOR=g TAGPRINTED=false GETCONTENT=false PROSTPROCESS=cat Debug=${Debug:-false} TMP=/tmp/xml_read.$RANDOM USAGE="${C}${FUNCNAME}${c} [-cdlp] [-x command <-a attribute>] <file.xml> [tag | \"any\"] [attributes .. | \"content\"] ${nn[2]} -c = NOCOLOR${END} ${nn[2]} -d = Debug${END} ${nn[2]} -l = LIGHT (no \"attribute=\" printed)${END} ${nn[2]} -p = FORCE PRINT (when no attributes given)${END} ${nn[2]} -x = apply a command on an attribute and print the result instead of the former value, in green color${END} ${nn[1]} (no attribute given will load their values into your shell; use '-p' to print them as well)${END}" ! (($#)) && echo2 "$USAGE" && return 99 (( $# < 2 )) && ERROR nbaram 2 0 && return 99 # getopts: while getopts :cdlpx:a: _OPT 2>/dev/null do { case ${_OPT} in c) PROSTPROCESS="${DECOLORIZE}" ;; d) local Debug=true ;; l) LIGHT=true; XAPPLIED_COLOR=END ;; p) FORCE_PRINT=true ;; x) XAPPLY=true; XCOMMAND="${OPTARG}" ;; a) XATTRIBUTE="${OPTARG}" ;; *) _NOARGS="${_NOARGS}${_NOARGS+, }-${OPTARG}" ;; esac } done shift $((OPTIND - 1)) unset _OPT OPTARG OPTIND [ "X${_NOARGS}" != "X" ] && ERROR param "${_NOARGS}" 0 fileXml=$1 tag=$2 (( $# > 2 )) && shift 2 && attributes=$* (( $# > 1 )) && MULTIPLE_ATTR=true [ -d "${fileXml}" -o ! -s "${fileXml}" ] && ERROR empty "${fileXml}" 0 && return 1 $XAPPLY && $MULTIPLE_ATTR && [ -z "${XATTRIBUTE}" ] && ERROR param "-x command " 0 && return 2 # nb attributes == 1 because $MULTIPLE_ATTR is false [ "${attributes}" == "content" ] && GETCONTENT=true while xml_read_dom; do # (( CR != 0 )) && break (( PIPESTATUS[1] != 0 )) && break if $ITSACOMMENT; then # oh wait it doesn't work on IBM AIX bash 3.2.16(1): # if [ "x${COMMENTS:(-2):2}x" == "x--x" ]; then COMMENTS="${COMMENTS:0:(-2)}" && ITSACOMMENT=false # elif [ "x${COMMENTS:(-3):3}x" == "x-->x" ]; then COMMENTS="${COMMENTS:0:(-3)}" && ITSACOMMENT=false if [ "x${COMMENTS:${#COMMENTS} - 2:2}x" == "x--x" ]; then COMMENTS="${COMMENTS:0:${#COMMENTS} - 2}" && ITSACOMMENT=false elif [ "x${COMMENTS:${#COMMENTS} - 3:3}x" == "x-->x" ]; then COMMENTS="${COMMENTS:0:${#COMMENTS} - 3}" && ITSACOMMENT=false fi $Debug && echo2 "${N}${COMMENTS}${END}" elif test "${TAG_NAME}"; then if [ "x${TAG_NAME}x" == "x${tag}x" -o "x${tag}x" == "xanyx" ]; then if $GETCONTENT; then CONTENT="$(trim "${CONTENT}")" test ${CONTENT} && echo "${CONTENT}" else # eval local $ATTRIBUTES => eval test "\"\$${attribute}\"" will be true for matching attributes eval local $ATTRIBUTES $Debug && (echo2 "${m}${TAG_NAME}: ${M}$ATTRIBUTES${END}"; test ${CONTENT} && echo2 "${m}CONTENT=${M}$CONTENT${END}") if test "${attributes}"; then if $MULTIPLE_ATTR; then # we don't print "tag: attr=x ..." for a tag passed as argument: it's usefull only for "any" tags so then we print the matching tags found ! $LIGHT && [ "x${tag}x" == "xanyx" ] && tag2print="${g6}${TAG_NAME}: " for attribute in ${attributes}; do ! $LIGHT && attribute2print="${g10}${attribute}${g6}=${g14}" if eval test "\"\$${attribute}\""; then test "${tag2print}" && ${print} "${tag2print}" TAGPRINTED=true; unset tag2print if [ "$XAPPLY" == "true" -a "${attribute}" == "${XATTRIBUTE}" ]; then eval ${print} "%s%s\ " "\${attribute2print}" "\${${XAPPLIED_COLOR}}\"\$(\$XCOMMAND \$${attribute})\"\${END}" && eval unset ${attribute} else eval ${print} "%s%s\ " "\${attribute2print}" "\"\$${attribute}\"" && eval unset ${attribute} fi fi done # this trick prints a CR only if attributes have been printed durint the loop: $TAGPRINTED && ${print} "\n" && TAGPRINTED=false else if eval test "\"\$${attributes}\""; then if $XAPPLY; then eval echo "\${g}\$(\$XCOMMAND \$${attributes})" && eval unset ${attributes} else eval echo "\$${attributes}" && eval unset ${attributes} fi fi fi else echo eval $ATTRIBUTES >>$TMP fi fi fi fi unset CR TAG_NAME ATTRIBUTES CONTENT COMMENTS done < "${fileXml}" | ${PROSTPROCESS} # http://mywiki.wooledge.org/BashFAQ/024 # INFO: I set variables in a "while loop" that's in a pipeline. Why do they disappear? workaround: if [ -s "$TMP" ]; then $FORCE_PRINT && ! $LIGHT && cat $TMP # $FORCE_PRINT && $LIGHT && perl -pe 's/[[:space:]].*?=/ /g' $TMP $FORCE_PRINT && $LIGHT && sed -r 's/[^\"]*([\"][^\"]*[\"][,]?)[^\"]*/\1 /g' $TMP . $TMP rm -f $TMP fi unset ITSACOMMENT } 

और अंत में, rtrim, ट्रिम और echo2 (stderr) फ़ंक्शंस:

 rtrim() { local var=$@ var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters echo -n "$var" } trim() { local var=$@ var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters echo -n "$var" } echo2() { echo -e "$@" 1>&2; } 

colorization:

ओह, और आपको पहले से परिभाषित होने के लिए कुछ साफ रंगाई वाले डायनामिक वैरिएबल की आवश्यकता होगी, और निर्यात भी होगा:

 set -a TERM=xterm-256color case ${UNAME} in AIX|SunOS) M=$(${print} '\033[1;35m') m=$(${print} '\033[0;35m') END=$(${print} '\033[0m') ;; *) m=$(tput setaf 5) M=$(tput setaf 13) # END=$(tput sgr0) # issue on Linux: it can produces ^[(B instead of ^[[0m, more likely when using screenrc END=$(${print} '\033[0m') ;; esac # 24 shades of grey: for i in $(seq 0 23); do eval g$i="$(${print} \"\\033\[38\;5\;$((232 + i))m\")" ; done # another way of having an array of 5 shades of grey: declare -a colorNums=(238 240 243 248 254) for num in 0 1 2 3 4; do nn[$num]=$(${print} "\033[38;5;${colorNums[$num]}m"); NN[$num]=$(${print} "\033[48;5;${colorNums[$num]}m"); done # piped decolorization: DECOLORIZE='eval sed "s,${END}\[[0-9;]*[m|K],,g"' 

यह सब सामान कैसे लोड करें:

या तो आप जानते हैं कि फ़ंक्शन कैसे बनाएं और उन्हें FPATH (ksh) या FPATH (बीश) का अनुकरण के माध्यम से लोड करें

यदि नहीं, तो बस कमांड लाइन पर सब कुछ कॉपी / पेस्ट करें।

यह कैसे काम करता है :

xml_read [-cdlp] [-x कमांड <-ए विशेषता>] [टैग | "कोई"] [विशेषताओं .. | "सामग्री"]

-c = NOCOLOR

-d = डीबग करें

-l = लाइट (नहीं \ "विशेषता = \" मुद्रित)

-p = बांका प्रिंट (जब कोई विशेषता नहीं दी गई)

-x = एक विशेषता पर एक आदेश लागू करें और पूर्व मान के बजाय परिणाम प्रिंट करें, हरे रंग में

(दिए गए कोई भी विशेषता अपने मूल्यों को $ एटीआरआईआईबीयूटी = वैल के रूप में अपने लोड में लोड कर देगा, उन्हें प्रिंट करने के लिए '-p' का उपयोग करें)

 xml_read server.xml title content # print content between <title></title> xml_read server.xml Connector port # print all port values from Connector tags xml_read server.xml any port # print all port values from any tags 

डीबग मोड (-डी) टिप्पणियों और पार्स किए गए विशेषताओं के साथ stderr को मुद्रित किया जाता है

यह कार्य करता है यदि आप XML विशेषताएँ चाहते हैं:

 $ cat alfa.xml <video server="asdf.com" stream="H264_400.mp4" cdn="limelight"/> $ sed 's.[^ ]*..;s./>..' alfa.xml > alfa.sh $ . ./alfa.sh $ echo "$stream" H264_400.mp4 

हालांकि बहुत कुछ तैयार कंसोल सुविधाएं हैं जो आपके लिए क्या चाहते हैं, मेरे अनुभव में यह सामान्य प्रयोजन प्रोग्रामिंग भाषा जैसे पायथन जैसे कुछ लाइनों को लिखने में काफी कम समय लगता है, जिसे आप आसानी से बढ़ा सकते हैं और अपनी आवश्यकताओं के अनुसार अनुकूलन करें

यहां एक पायथन लिपि का एक उदाहरण है lxml मॉड्यूल – यह पहली पैरामीटर के रूप में फ़ाइल का नाम लेता है, दूसरे पैरामीटर के रूप में एक XPath अभिव्यक्ति है, और दिए गए XPath अभिव्यक्ति से मेल खाने वाले स्ट्रिंग / नोड्स को प्रिंट करता है।

 #!/usr/bin/env python import sys from lxml import etree tree = etree.parse(sys.argv[1]) xpath_expression = sys.argv[2] for e in tree.xpath(xpath_expression): if isinstance(e, str): print(e) else: print(e.text or etree.tostring(e)) 

lxml को pip install lxml साथ स्थापित किया जा सकता है उबुंटू पर आप sudo apt install python-lxml उपयोग कर सकते हैं।

प्रयोग

 python xmlcat.py file.xml "//mynode" 

lxml इनपुट के रूप में एक यूआरएल भी स्वीकार कर सकता है:

 python xmlcat.py http://example.com/file.xml "//mynode" 

एक enclosure नोड के अंतर्गत url विशेषता को निकालें (यानी <enclosure url="http:...""..> ):

 python xmlcat.py xmlcat.py file.xml "//enclosure/@url" 

नोट: lxml गति के मामले में बहुत अच्छा प्रदर्शन करता है क्योंकि यह सी में लिखा गया एक अच्छी तरह से अनुकूलित देशी मॉड्यूल है।


2 ¢: कुछ आधे-रखरखाव उपयोगिता की अस्पष्ट सिंटैक्स सीखने में समय व्यतीत न करें। उसके लिए जीवन बहुत छोटा है व्यापक रूप से प्रयुक्त एपीआई के साथ अपने प्रोग्रामिंग कौशल को विस्तारित करने के बजाय उपलब्ध संसाधनों का उपयोग करें।