如何用 shell 脚本替换某一行之后第 9 行的内容?

如何用 shell 脚本替换某一行之后第 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,我应该如何使用 shell 脚本来做到这一点?

答案1

你的问题有点不清楚,但无论你真正想要什么,你都可以从 shell 脚本调用 perl:

  • 以下代码只会更改truefalse在线5
#!/bin/sh
perl -pi -e 's/true/false/ if($. == 5)' /usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml
  • 更改$. == 5$. > 5将确保它发生在第 5 行之后的任何地方

答案2

我已经理解你的问题是询问如何在开始的节中更改<default>false</default>为。<default>true<default><key name='require-encryption' type='b'>

使用 XML 解析器,您可以根据结构而不是文件中行的物理布局可靠地更改此设置。以下是您可以如何使用xmlstarlet.

出于示例的目的,我已将您的代码片段用<root>…包装起来,转换为有效的 XML </root>。您的原始文件已经是有效的 XML,因此不需要进行此编辑,但您可能需要更精确地进行 XPath 匹配。使用此代码来匹配 的元素路径…/key/default,其中key有一个name值为 的属性require-encryption,并将 的 值更改为default文字true

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

相关内容