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

目的の出力を取得するもう1つの方法は、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>
$

関連情報