내 파일의 마지막 몇 줄은 다음과 같습니다 /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 파일이므로 xq
XML 파서 도구를 사용하여 파일을 처리하겠습니다.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/key
name
enabled
귀하의 예 출력 :
<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
원하는 출력을 얻는 또 다른 방법은 xsltproc
GNOME 데스크탑을 사용하는 경우 기본적으로 설치되는 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>
$