XML 파일에서 특정 태그 부분을 찾는 방법은 무엇입니까?

XML 파일에서 특정 태그 부분을 찾는 방법은 무엇입니까?

내 파일의 마지막 몇 줄은 다음과 같습니다 /usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml.

<schemalist>
  <schema>
   <!-- some other tags -->

    <key name='notify-on-connect' type='b'>
      <summary>Notify on connect</summary>
      <description>
        If true, show a notification when a user connects to the system.
      </description>
      <default>true</default>
    </key>

    <key name='enabled' type='b'>
      <summary>Enable remote access to the desktop</summary>
      <description>
      If true, allows remote access to the desktop via the RFB
      protocol. Users on remote machines may then connect to the
      desktop using a VNC viewer.
      </description>
      <default>false</default>
    </key>
  </schema>
</schemalist>

이 단락을 원하는 경우 grep:

<key name='enabled' type='b'>
  <summary>Enable remote access to the desktop</summary>
  <description>
  If true, allows remote access to the desktop via the RFB
  protocol. Users on remote machines may then connect to the
  desktop using a VNC viewer.
  </description>
  <default>false</default>
</key>

grep이를 달성하려면 이 명령을 어떻게 사용해야 합니까 ?

답변1

귀하가 제공한 예는 유효한 XML 파일이므로 xqXML 파서 도구를 사용하여 파일을 처리하겠습니다.yq설치 패키지.

xq -x --xml-root key '
    .schemalist.schema.key[] | select(."@name" == "enabled")
' infile.xml

"key" 태그의 "@name" 속성이 "enabled"와 같으면 "key" 태그가 선택됩니다.

에서 xq -h:

--xml-출력, -x
jq JSON 출력을 다시 XML로 트랜스코딩하고 내보냅니다.
--xml-rootXML_ROOT
다시 XML로 트랜스코딩할 때 출력을 이 이름의 요소로 래핑합니다.

답변2

유효한 XML을 다루고 있으므로 다음을 사용할 수 있습니다 xmlstarlet.

xmlstarlet sel -t -c "/schemalist/schema/key[@name='enabled']" infile.xml

이는 XML 문서를 쿼리( )하고 sel속성이 selected로 설정된 XML 노드가 있는 XPATH 요소의 복사본을 인쇄합니다.-c/schemalist/schema/keynameenabled

귀하의 예 출력 :

<key name="enabled" type="b">
      <summary>Enable remote access to the desktop</summary>
      <description>
      If true, allows remote access to the desktop via the RFB
      protocol. Users on remote machines may then connect to the
      desktop using a VNC viewer.
      </description>
      <default>false</default>
    </key>

답변3

명확히 해야 할 것은 다음과 같습니다.

grep이는 이와 유사한 것이 아니라 XML 문서를 이해하는 일부 도구의 작업일 가능성이 높습니다 . 이에 대한 좋은 답변이 있습니다.


아마도:

grep

perl-regexp 및 기타 추가 기능을 사용하십시오.

grep -Pzo "(?s)\N*<key name='enabled'.*<\/key>\n" the_file.xml

또는 조금 더 제한을 적용합니다(선행 공백은 캡처되지 않음).

grep -zo "<key name='enabled'.*<\/key>."

awk

awk '
/<key name='\''enabled'\''/ { p=1 }
p { print $0 }
p && /<\/key>/ { exit }
' the_file.xml

또는

awk "/<key name='enabled'/,/<\/key>/" the_file.xml

sed

sed -n '/<key name='\''enabled'\''/,/<\/key>/p' the_file.xml

답변4

원하는 출력을 얻는 또 다른 방법은 xsltprocGNOME 데스크탑을 사용하는 경우 기본적으로 설치되는 XSL(Extensible Stylesheet Language)을 사용하여 입력 문서를 원하는 문서(출력)로 변환하는 것입니다.

스타일시트는 다음과 같습니다.

$ cat transform.xsl
<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='xml' omit-xml-declaration='yes' />

<xsl:template match="/schemalist/schema/key[@name='enabled']">
    <xsl:copy-of select="." />
</xsl:template>

<xsl:template match='text()|@*'/>

</xsl:stylesheet>

출력은 다음과 같습니다.

$ xsltproc transform.xsl input.xml
<key name="enabled" type="b">
      <summary>Enable remote access to the desktop</summary>
      <description>
      If true, allows remote access to the desktop via the RFB
      protocol. Users on remote machines may then connect to the
      desktop using a VNC viewer.
      </description>
      <default>false</default>
    </key>
$

관련 정보