シェルスクリプトを使用して、特定の行の後にある9行目の内容を置き換える方法は?

シェルスクリプトを使用して、特定の行の後にある9行目の内容を置き換える方法は?

/usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml ファイルの一部は次のとおりです。

    <key name='alternative-port' type='q'>
      <summary>Alternative port number</summary>
      <description>
        The port which the server will listen to if the 'use-alternative-port'
        key is set to true. Valid values are in the range of 5000 to 50000.
      </description>
      <default>5900</default>
    </key>

    <key name='require-encryption' type='b'>
      <summary>Require encryption</summary>
      <description>
        If true, remote users accessing the desktop are required to
        support encryption. It is highly recommended that you use a
        client which supports encryption unless the intervening network
        is trusted.
      </description>
      <default>false</default>
    </key>

    <key name='authentication-methods' type='as'>
      <summary>Allowed authentication methods</summary>
      <description>
        Lists the authentication methods with which remote users may
        access the desktop.

        There are two possible authentication methods; "vnc" causes the
        remote user to be prompted for a password (the password is
        specified by the vnc-password key) before connecting and "none"
        which allows any remote user to connect.
      </description>
      <default>['none']</default>
    </key>

これで、文字列がfalseの段落をtrueに変更したいと思います。シェルスクリプトを使用してどうすればよいですか?

答え1

あなたの質問は少し不明ですが、実際に欲しいものが何であれ、シェルスクリプトからPerlを呼び出すことができます。

  • 次のコードはオンラインtrueでのみ変更されます。false5
#!/bin/sh
perl -pi -e 's/true/false/ if($. == 5)' /usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml
  • $. == 5に変更すると、$. > 55行目以降のどこでも発生します。

答え2

<default>false</default>あなたの質問が開始セクションでどのように変更されるかを尋ねることをすでに理解しています。<default>true<default><key name='require-encryption' type='b'>

XMLパーサーを使用すると、ファイル行の実際のレイアウトではなく構造に基づいてこの設定を確実に変更できます。使用方法は次のとおりですxmlstarlet

<root>たとえば、有効なXMLに変換するためにコードスニペットを...にラップしました</root>。元のファイルはすでに有効なXMLであるため、編集する必要はありませんが、より正確なXPathマッチングをしたい場合があります。このコードを使用して、値を持つ属性を持つ要素のパス…/key/defaultを一致させ、値をリテラルに変更します。keynamerequire-encryptiondefaulttrue

xmlstarlet ed -u '//key[@name="require-encryption"]/default' -v true org.gnome.Vino.gschema.xml

通常どおりこの作業を内部で実行するには、標準レシピを使用してくださいcommand > output.tmp && mv -f output.tmp output。 (これは多くのGNUコマンドの-i/--in-placeフラグが後で行うのとほぼ同じです。)

xmlstarlet … > org.gnome.Vino.gschema.xml.tmp &&
    mv -f org.gnome.Vino.gschema.xml.tmp org.gnome.Vino.gschema.xml

関連情報