sed 명령 - 파일의 문자열 바꾸기

sed 명령 - 파일의 문자열 바꾸기

server.xml파일의 값을 수정하고 싶습니다 .

<?xml version='1.0' encoding='utf-8'?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!-- Note:  A "Server" is not itself a "Container", so you may not
     define subcomponents such as "Valves" at this level.
     Documentation at /docs/config/server.html
 -->
<Server port="9001" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
  -->
  <!--APR library loader. Documentation at /docs/apr.html -->
  <!--
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  -->
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <!-- Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
  -->
  <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <!-- A "Service" is a collection of one or more "Connectors" that share
       a single "Container" Note:  A "Service" is not itself a "Container",
       so you may not define subcomponents such as "Valves" at this level.
       Documentation at /docs/config/service.html
   -->
  <Service name="Catalina">

    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
    <!--
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
    -->


    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
    -->
    <Connector port="8180" protocol="HTTP/1.1"
               connectionTimeout="20000"
               URIEncoding="UTF-8"
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8181" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
    <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443
         This connector uses the NIO implementation that requires the JSSE
         style configuration. When using the APR/native implementation, the
         OpenSSL style configuration is required as described in the APR/native
         documentation -->
    <!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
    -->

    <!-- Define an AJP 1.3 Connector on port 8009 -->

    <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />



    <!-- An Engine represents the entry point (within Catalina) that processes
         every request.  The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html -->

    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvmB04905-2">

      <!--For clustering, please take a look at documentation at:
          /docs/cluster-howto.html  (simple how to)
          /docs/config/cluster.html (reference documentation) -->
      <!--
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      -->

      <!-- Use the LockOutRealm to prevent attempts to guess user passwords
           via a brute-force attack -->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="false" autoDeploy="false">

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>
    </Engine>
  </Service>
</Server>

jvmRoute=이 값을 다른 값으로 바꾸고 싶습니다 .

예:

이전 값:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvmB04905-2">

새 값:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="VALUE10">

이 명령을 실행할 때:

sed -i '/^jvmRoute=/s/=.*/=VALUE10/' server.xml

내 파일에는 아무것도 변경되지 않았습니다. 왜 그렇습니까?

답변1

sed파일에 string 으로 시작하는 줄이 포함되어 있지 않기 때문에 명령은 아무것도 변경하지 않습니다 jvmRoute.

XML 구문 분석은 XML 구문 분석기를 사용하여 수행되어야 합니다.

XMLStarlet은 좋은 명령줄 파서입니다.

$ xml ed -u '//Engine/@jvmRoute' -v 'VALUE10' server.xml >server-new.xml

jvmRoute그러면 모든 노드의 속성 값이 Engine문자열로 변경되고 VALUE10결과 XML이 server-new.xml.

Engine다음을 사용하여 노드 값만 변경하십시오 defaultHost="localhost".

xml ed -u '//Engine[@defaultHost="localhost"]/@jvmRoute' -v 'VALUE10' server.xml >server-new.xml

XMLStarlet은 다음에서 사용할 수 있습니다.http://xmlstar.sourceforge.net/, 하지만 먼저 패키지 관리자를 확인하세요. xmlstarlet때로는 XMLStarlet 실행 파일이 xml.

답변2

그리고 sed:

 sed -E  's/(jvmRoute=)([a-zA-Z0-9"-])+/\1"VALUE10"/g'

원래 값이 무엇인지 지정하지 않았기 때문에 jvmRoute위 예에 대한 정규식을 작성했지만 필요에 따라 사용자 정의할 수 있습니다.
파일에서 직접 바꾸려면 다음을 사용하십시오.

sed -i -E  's/(jvmRoute=)([a-zA-Z0-9"-])+/\1"VALUE10"/g' server.xml

그러나 XML 파서를 사용하는 것이 아마도 가장 좋은 방법일 것입니다.

답변3

sed 's/patternFrom/patternTo/' file.txt

• "s/"는 다음을 바꾸는 것을 의미합니다. 이제 한 줄 명령을 입력하여 이 바꾸기를 파일에 적용해야 합니다.

• sed는 선택한 행 세트에만 명령을 적용할 수 있습니다. 줄은 줄 1부터 시작하여 파일 내에서 점진적인 번호 매기기로 식별됩니다.

예를 들어:

sed '2s/patternFrom/patternTo' file.txt

• 두 번째 라인에서만 교체 수행

또는

sed '2,$s/patternFrom/patternTo' file.txt

• 라인 2부터 특수 기호 "$"로 식별되는 마지막 라인까지 교체를 수행합니다.

심지어

• sed에는 보유 공간이라는 내부 버퍼가 포함되어 있습니다. 이 버퍼는 "g"와 같은 특정 명령으로 활성화될 수 있습니다. 'g' 명령은 입력 라인에서 일치 항목이 반복될 수 있도록 예약된 공간으로 현재 입력 라인을 대체합니다.

귀하의 경우 모든 줄에서 다음 항목을 모두 일치시키십시오.

sed 's/patternFrom/patternTo/g' file.txt

내가 생각하기에 작동하지 않는 것은 패턴이다

정규식이 유효한지 확인하려면 다음을 사용해 보세요.

sed 's/jvmRoute="[a-zA-Z0-9-\.]*["]/jvmRoute="VALUE10"/g

답변4

"jvmRoute"로 시작하는 줄이 없습니다. ( ^줄의 시작을 나타냅니다. 파일에서 두 항목을 모두 변경하려면 생략하세요.)

관련 정보