1

エラーが発生している sed/perl を使用して、いくつかの特殊文字を置き換えようとしています。

以下のコマンドでは、SEARCHFIELDAPP、OLD_STRING、NEW_STRING などの値を置き換えようとしています。

Server1> SERVER_COMMAND="perl -F'\|' -i -lape  'if (\$F[0] eq \"SEARCHFIELDAPP\" && \$F[1] eq \"SEARCHFIELDDB\" && \$F[6] eq \"SEARCHFIELDUNM\" )  { s/\|OLD_STRING\|/\|NEW_STRING\|/g; s/\|LAST_UPDATE_DT/\|CURR_UPDATE_DT/g }' " 

上記のコマンドをコンソールに出力すると、以下のようになります。

Server1> echo $SERVER_COMMAND
perl -F'\|' -i -lape 'if ($F[0] eq "SEARCHFIELDAPP" && $F[1] eq "SEARCHFIELDDB" && $F[6] eq "SEARCHFIELDUNM" ) { s/\|OLD_STRING\|/\|NEW_STRING\|/g; s/\|LAST_UPDATE_DT/\|CURR_UPDATE_DT/g }'

上記のコマンド文字列では、いくつかの文字列を置き換えようとしています:

Server1> echo $SERVER_COMMAND | sed -e "s|SEARCHFIELDAPP|ALLOWSERVICE|;s|SEARCHFIELDDB|DataDup|;s|SEARCHFIELDUNM|mogga|;s|OLD_STRING|mogga_dev_$%^|;s|NEW_STRING|mogga&*%^$|;s|LAST_UPDATE_DT|09-21-2012:11:09:41|;s|CURR_UPDATE_DT|09-21-2012:11:18:17|;"

これを行うと、以下に示すような出力が得られます。

perl -F'\|' -i -lape 'if ($F[0] eq "ALLOWSERVICE" && $F[1] eq "DataDup" && $F[6] eq "mogga" ) { s/\|mogga_dev_$%^\|/\|moggaNEW_STRING*%^$\|/g; s/\|09-21-2012:11:09:41/\|09-21-2012:11:18:17/g }'

ここでの問題は、置換 s|NEW_STRING|mogga&*%^$|; にあります。. NEW_STRINGがmogga&*%^$に置き換えられることを期待していましたが、 moggaNEW_STRING*%^$ に置き換えられています。

ここで&はNEW_STRING として解釈されます。&をエスケープすると、正常に動作します。しかし、子スクリプトで動的に使用する親スクリプトからこの文字列を取得します。文字をエスケープせずに、文字列をそのまま正常に置き換える方法を探しています。エスケープすると、避けたいエスケープ文字で着信文字列を変更する必要があります。

置換に perl one liner を使用して同じことを試しました。しかし、ここでも特殊文字で同様の問題に直面しています。

Server1> echo $SERVER_COMMAND |  perl -p -i -e 's|SEARCHFIELDAPP|ALLOWSERVICE|;s|SEARCHFIELDDB|DataDup|;s|SEARCHFIELDUNM|mogga|;s|OLD_STRING|mogga_dev_$%^|;s|NEW_STRING|mogga&*%^|;s|LAST_UPDATE_DT|09-21-2012:11:09:41|;s|CURR_UPDATE_DT|09-21-2012:11:18:17|;'

置換後の外観は次のとおりです。

perl -F'\|' -i -lape 'if ($F[0] eq "ALLOWSERVICE" && $F[1] eq "DataDup" && $F[6] eq "mogga" ) { s/\|mogga_dev_0^\|/\|mogga&*%^\|/g; s/\|09-21-2012:11:09:41/\|09-21-2012:11:18:17/g }'

文字列mogga_dev_$%^に置き換えられるはずだった文字列 OLD_STRING がmogga_dev_0 ^置き換えられました。ここで$%は0に変換されています

この場合も、問題のある文字をエスケープすることで期待どおりの結果が得られます。

特殊文字をエスケープする以外に、この解釈を回避する方法を教えてください。

ありがとう


ウィリアムの入力の後、私はエラーなしで以下を達成することができました:

perl -F'\|' -i -lape 'if ($F[0] eq "ALLOWSERVICE" && $F[1] eq "DataDup" && $F[6] eq "mogga" ) { s/\|mogga_dev_!$%^\|/\|mogga!&*%^$@*&^%\|/g; s/\|09-21-2012:11:09:41/\|09-21-2012:11:18:17/g }'

しかし、置換のためにファイルでこれを実行すると。ファイル内で文字列mogga_dev_!$%^がmogga!& %^$@ &^%に置き換えられていません。

特殊文字はエスケープされないので、置換は起きていないと思います。しかし、特殊文字をエスケープするためにエスケープを使用したくありません。ファイル内の文字列を特殊文字に置き換える他の方法を教えてください。

ありがとう

4

1 に答える 1

0

perl では、補間を回避する簡単な方法'は区切り文字として使用することです。例えば。

perl -pe "s'OLD_STRING'mogga_dev_\$%^'"

この場合、$文字列mogga_dev_$%^を perl に取得するために をエスケープする必要がありますが、おそらくこれが役立つでしょう。エスケープ文字を追加しないようにしようとしている文字列が正確にはわかりません。 stringmogga_dev_$%^に文字列があるNEW_STRING場合は、次のことができます。

perl -pe "s'"$OLD_STRING"'"$NEW_STRING"'"
于 2012-09-21T17:29:51.157 に答える