私のファイルの最後の数行は次のとおりです/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
目的の出力を取得するもう1つの方法は、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>
$