programing

XML 명령줄 처리를 위한 Grep and Sed equivalent

newsource 2023. 9. 17. 13:16

XML 명령줄 처리를 위한 Grep and Sed equivalent

셸 스크립트를 수행할 때 일반적으로 데이터는 csv와 같은 한 줄 레코드의 파일에 저장됩니다.이 데이터를 처리하는 것은 정말 간단합니다.grep그리고.sed. 하지만 XML을 자주 처리해야 하므로 명령줄을 통해 해당 XML 데이터에 액세스할 수 있는 스크립트를 작성할 수 있는 방법이 필요합니다.가장 좋은 도구는 무엇입니까?

xmlstarlet이 이런 일에 꽤 능숙하다는 것을 알았습니다.

http://xmlstar.sourceforge.net/

대부분의 배포자 저장소에서도 사용할 수 있어야 합니다.소개 튜토리얼은 다음과 같습니다.

http://www.ibm.com/developerworks/library/x-starlet.html

몇 가지 유망한 도구:

  • nokogiri: XPath & CSS Selector를 사용하여 루비의 HTML/XML DOM 파싱

  • hpricot: 사용되지 않음

  • fxgrep: 자체 XPath와 유사한 구문을 사용하여 문서를 쿼리합니다.SML로 작성되어 있어 설치가 어려울 수 있습니다.

  • LT XML: SGML 도구에서 파생된 XML 툴킷:sggrep,sgsort,xmlnorm그 밖의 사람들.자체 쿼리 구문을 사용합니다.그 문서는 매우 격식을 차립니다.C. LT XML 2에 기술되어 XPath, Xinclude 및 기타 W3C 표준을 지원한다고 주장합니다.

  • xmlgrep2: XPath로 간단하고 강력한 검색.XML::LibXML 및 libxml2를 사용하여 Perl로 작성.

  • XQSharp: XPath로의 확장인 XQuery를 지원합니다.을 위해 작성되었습니다.NET Framework.

  • xml-coreutils: GNU coreutils와 동등한 Laird Breyer의 툴킷.이상적인 툴킷이 무엇을 포함해야 하는지에 대해 흥미로운 에세이로 논의했습니다.

  • xmldiff: 두 개의 xml 파일을 비교하기 위한 간단한 도구.

  • xmltk: debian, ubuntu, 페도라 또는 macports에 패키지가 없는 것 같고, 2007년 이후 출시되지 않았으며, 비포터블 빌드 자동화를 사용합니다.

xml-coreutils가 가장 잘 문서화되어 있고 UNIX를 지향하는 것 같습니다.

또한 있습니다.xml2그리고.2xmlpair. 일반적인 문자열 편집 도구가 XML을 처리할 수 있게 해줍니다.

예제. q.xml:

<?xml version="1.0"?>
<foo>
    text
    more text
    <textnode>ddd</textnode><textnode a="bv">dsss</textnode>
    <![CDATA[ asfdasdsa <foo> sdfsdfdsf <bar> ]]>
</foo>

xml2 < q.xml

/foo=
/foo=   text
/foo=   more text
/foo=   
/foo/textnode=ddd
/foo/textnode
/foo/textnode/@a=bv
/foo/textnode=dsss
/foo=
/foo=    asfdasdsa <foo> sdfsdfdsf <bar> 
/foo=

xml2 < q.xml | grep textnode | sed 's!/foo!/bar/baz!' | 2xml

<bar><baz><textnode>ddd</textnode><textnode a="bv">dsss</textnode></baz></bar>

추신. 또한.html2/2html.

Joseph Holsten의 훌륭한 목록에 Perl 라이브러리 XML::XPath와 함께 제공되는 xpath 명령줄 스크립트를 추가합니다.XML 파일에서 정보를 추출하는 좋은 방법:

 xpath -q -e '/entry[@xml:lang="fr"]' *xml

xmlint를 사용할 수 있습니다.

xmllint --xpath //title books.xml

대부분의 디스트로와 함께 번들로 제공되어야 하며, 또한 Cygwin과 함께 번들로 제공됩니다.

$ xmllint --version
xmllint: using libxml version 20900

참조:

$ xmllint
Usage : xmllint [options] XMLfiles ...
        Parse the XML files and output the result of the parsing
        --version : display the version of the XML library used
        --debug : dump a debug tree of the in-memory document
        ...
        --schematron schema : do validation against a schematron
        --sax1: use the old SAX1 interfaces for processing
        --sax: do not build a tree but work just at the SAX level
        --oldxml10: use XML-1.0 parsing rules before the 5th edition
        --xpath expr: evaluate the XPath expression, inply --noout

Windows에서 솔루션을 찾고 있다면, Powershell에는 XML을 읽고 쓰는 기능이 내장되어 있습니다.

test.xml:

<root>
  <one>I like applesauce</one>
  <two>You sure bet I do!</two>
</root>

파워셸 스크립트:

# load XML file into local variable and cast as XML type.
$doc = [xml](Get-Content ./test.xml)

$doc.root.one                                   #echoes "I like applesauce"
$doc.root.one = "Who doesn't like applesauce?"  #replace inner text of <one> node

# create new node...
$newNode = $doc.CreateElement("three")
$newNode.set_InnerText("And don't you forget it!")

# ...and position it in the hierarchy
$doc.root.AppendChild($newNode)

# write results to disk
$doc.save("./testNew.xml")

testNew.xml:

<root>
  <one>Who likes applesauce?</one>
  <two>You sure bet I do!</two>
  <three>And don't you forget it!</three>
</root>

출처 : https://serverfault.com/questions/26976/update-xml-from-the-command-line-windows

NetBSD xml 도구의 xmlsed & xmlgrep도 있습니다!

http://blog.huoc.org/xmltools-not-dead.html

정확히 무엇을 하고 싶은지에 달려있습니다.

XSLT가 가야 할 길일 수도 있지만 학습 곡선이 있습니다.xsltproc를 시도해 보고 매개변수를 제출할 수 있음을 기록합니다.

XPath 3.0/XQuery 3.0을 사용할 수 있는 명령줄도 있습니다(다른 명령줄 도구는 XPath 1.0을 사용함).

예:

http/http:

$ saxon-lint --html --xpath 'count(//a)' http://stackoverflow.com/q/91791
328

xml :

$ saxon-lint --xpath '//a[@class="x"]' file.xml

D. Bohdan은 구조화된 텍스트 도구를 위한 명령줄 도구 목록을 보관하는 오픈 소스 GitHub repo를 유지하고 있으며 XML/HTML 도구에 대한 섹션이 있습니다.

https://github.com/dbohdan/structured-text-tools#xml-html

XQuery가 좋은 솔루션일 수 있습니다.이것은 (상대적으로) 배우기 쉽고 W3C 표준입니다.

커맨드 라인 프로세서에 XQSharp을 추천합니다.

저는 xmlstarlet을 처음 사용했고 지금도 사용하고 있습니다.쿼리가 어려워지면 XML의 xpath2xquery 기능 지원이 필요합니다. xidel http://www.videlibri.de/xidel.html 로 전환합니다.

그렙 등가물

일부 python3 코드를 랩하는 "xp" ("xpath")와 같이 bash 함수를 정의할 수 있습니다.사용하려면 python3와 python-lxml을 설치해야 합니다.이점:

  1. 예를 들어 xmlint에서 부족한 regex matching.
  2. 명령줄에서 (파이프에서) 필터로 사용

다음과 같이 쉽고 강력하게 사용할 수 있습니다.

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

xpx는 다음과 같습니다.

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"
}

Sed equivalent

jq "프로그래밍 언어"의 모든 힘을 주는 xq를 사용하는 것을 고려해보세요.python-pip이 설치되어 있는 경우 pip install yq와 함께 xq를 설치할 수 있으며 아래 예제에서는 "Keep Accounts"를 "Keep Accounts 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

JEdit에는 XML 문서에 대한 쿼리 기능을 제공하는 "XQuery"라는 플러그인이 있습니다.

명령 줄은 아니지만 작동합니다!

언급URL : https://stackoverflow.com/questions/91791/grep-and-sed-equivalent-for-xml-command-line-processing