3

私は rhel5 を使用していますが、次の問題があります。特定の行のすべてのコンテンツを必要なテキストに置き換える関数があります。二重引用符を配置する必要があるまで、すべてが正常に機能します。以下はコードです:

ReplaceLine()
{
       txnFile="File.xml"
        if [ "$2" == "enable" ];then
                replace="<ref bean=\\"$3\\"/>"
        else
                replace="<!--<ref bean=\\"$3\\"/>-->"
        fi
        sed -i "$1s/.*/$replace/" $txnFile 
}

$1=line number
$2=enable/disable
$3=string to be put

現在のコードは、ファイル内の指定された行を次のように置き換えます。

<ref bean=beginEventBean/>

私が欲しいのはこれです:

<ref bean="beginEventBean"/>

二重引用符がないことに注意してください。また、変数内のスペースが原因でsedがエラーをスローしていたため、sedで二重引用符を使用しました。

どこが間違っているのかを理解するのを手伝ってください。すでにこれに何時間も費やしました。

4

4 に答える 4

1

ソース行を見ないと、ソリューションをテストできません。それにもかかわらず、次の行は間違いなくあなたが思っていることをしていません:

replace="<ref bean=\\"$3\\"/>"
        ^          ^ ^
        |          | |
start quoted       | |
           backslash |
            end quoted

バックスラッシュをもう 1 つ追加するか、1 つ削除します。

于 2012-11-01T08:56:09.937 に答える
1

タグを閉じるスラッシュをエスケープするのを忘れました。そして、2 つの多くのスラッシュを入れます。

# one line solution
# sed -i "$1s/.*/<ref bean=\"$3\"\/>/" $txnFile
#                          ^   ^ ^

ReplaceLine()
{
     txnFile="File.xml"
     if [ "$2" == "enable" ];then
            replace="<ref bean=\"$3\"\/>"
     else
            replace="<!--<ref bean=\"$3\"\/>-->"
     fi
     sed -i "$1s/.*/$replace/" $txnFile 
}
于 2012-11-01T09:13:35.547 に答える
1

を使用しsed -i "$1s#.*#\"$replace\"#" $txnFileます。が含まれているため、SED のセパレータとしての#代わりに使用することに注意してください。また、@choroba による回答は理にかなっています。コードが意図したとおりに動作し、「誤って」動作しないことを確認してください。/$replace/

于 2012-11-01T09:14:07.250 に答える
1

次のようなものが機能するはずです。

replace="<ref bean=\"$3\"\/>"

1 つのバックスラッシュ (二重引用符をエスケープする) と / 文字の前のバックスラッシュ (sed の置換コマンドで使用されるメタ文字ではなく、通常の文字として使用するためにエスケープする) に注意してください。

于 2012-11-01T09:00:25.477 に答える