sedを使用してファイルの指定された行の前にテキストを挿入するには?

sedを使用してファイルの指定された行の前にテキストを挿入するには?

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

    <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>
  </schema>
</schemalist>

次に、次の効果を得るために、この行の前にいくつかの行を追加したいと思います。

    <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>

sedコマンドで上記の効果を得るには、シェルスクリプトを作成する必要があります。

sed -i "/\</schema\>/i  \    <key name='enabled' type='b'>\n      <summary>Enable remote access to the desktop</summary>\n      <description>\n        If true, allows remote access to the desktop via the RFB\n        protocol. Users on remote machines may then connect to the\n        desktop using a VNC viewer.\n      </description>\n      <default>false</default>\n    </key>\n" /usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml

ただし、実行後の内容は追加されませんでした。上記の効果を得るには、sedをどのように使用して作成する必要がありますか?注:</schema>行の前には2つのスペースがあります。

答え1

このコマンドは、次のテンプレートを使用して入力ファイルから変更するのではなく、i\バックスラッシュでエスケープされたリテラルハードコーディングされた改行文字を使用します。\n

sed -i.BAK -e '
/<\/schema>/i\
    <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>
' /usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml

## now do a diff between these:
diff /usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml /usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml.BAK

関連情報