1

私は bash スクリプトを書いていますが、XML ファイルに変更を加えて、さまざまなサーブレット名の項目を「disabledController」に置き換える必要があります。

sed を使用してこれを実行できることはわかっていますが、同じ文字列を持つ 2 つの異なる行がありますが、変更する必要があるのは 1 つだけです。

たとえば、これを変更する必要があります。

<servlet>
        <servlet-name>CreateCertificateAuthorityBackup</servlet-name>
        <servlet-class>com.company.ca.CABackup</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>CreateCertificateAuthorityBackup</servlet-name>
        <url-pattern>createCertificateAuthorityBackup</url-pattern>
    </servlet-mapping>

これに:

<servlet>
        <servlet-name>CreateCertificateAuthorityBackup</servlet-name>
        <servlet-class>com.company.ca.CABackup</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>disabledControler</servlet-name>
        <url-pattern>createCertificateAuthorityBackup</url-pattern>
    </servlet-mapping>

sed を次のように使用する場合:

sed "s@<servlet-name>CreateCertificateAuthorityBackup.*@<servlet-name>disabledController</servlet-name>@"

2 番目の項目だけでなく、両方の servlet-name 項目を置き換えます。私がここでやりたいことをする方法はありますか?

4

2 に答える 2

1

2 番目のオカレンスだけを置き換えるには、ファイルの先頭からネストとパターン範囲を使用します。

sed -i '0,/CreateCertificateAuthorityBackup/! { 0,//s//disabledController/ }' file

または完全に:

sed -i '0,/CreateCertificateAuthorityBackup/! { 0,/CreateCertificateAuthorityBackup/s/CreateCertificateAuthorityBackup/disabledController/ }' file

手書きコマンドの説明:

0,/CreateCertificateAuthorityBackup/      # is a pattern range from the start of
                                          # the file to the first occurrence of:
                                          # 'CreateCertificateAuthorityBackup'

! { ... }                                 # if not in the above pattern range, do
                                          # every between the braces.

0,/CreateCertificateAuthorityBackup/      # match between the beginning of the
                                          # file again and the next occurrence
                                          # of 'CreateCertificateAuthorityBackup'

s/ ... / ... /                            # perform the necessary substitution

3 番目のオカレンスを置き換えたい場合は、ネストの別のレイヤーを追加するだけです。

sed '0,/CreateCertificateAuthorityBackup/! { 0,//! { 0,// s//disabledController/ } }' file

編集:

「servlet-mapping」タグ間で変更を加えるために必要なのは、単一のパターン範囲だけです。

sed '/<servlet-mapping>/,/<\/servlet-mapping>/s/CreateCertificateAuthorityBackup/disabledController/' file

パターン範囲の詳細については、こちらをご覧ください。HTH。

于 2013-02-11T01:34:52.543 に答える
0

XML ツールを使用して XML を変更します。これにより、ソリューションはテキストとして扱うよりもはるかに堅牢になり、標準に準拠したものになります。ファイルが XML 規則に従って再フォーマットされていれば置換は失敗せず、他の XML 標準ツールが同じファイルで動作しても壊れません。

次のような値のxmlstarletを置き換えるために使用できます。servlet-mappingservlet-nameCreateCertificateAuthorityBackup

xmlstarlet edit -L \
  -u '/web-app/servlet-mapping/servlet-name[normalize-space(text())="CreateCertificateAuthorityBackup"]' \
  -v "disabledController"  web.xml

このように与えられたweb.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <servlet>
    <servlet-name>CreateCertificateAuthorityBackup</servlet-name>
    <servlet-class>com.company.ca.CABackup</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>CreateCertificateAuthorityBackup</servlet-name>
    <url-pattern>createCertificateAuthorityBackup</url-pattern>
  </servlet-mapping>
</web-app>
于 2013-02-11T02:19:13.230 に答える