쉘 스크립트를 사용하여 특정 줄 다음에 있는 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

관련 정보