ファイルの文字列を別の文字列に置き換える

ファイルの文字列を別の文字列に置き換える

AIX 6.1では、文字列「FULL_RUN_SCRIPT_DIR」をすべて「/etc/rc.d/..」と同じパスに置き換えようとします。

これはコードです

        SEE_FILE_PATH="$INIT_DIR$SERVICE_NAME"
        FULL_RUN_SCRIPT_DIR="FULL_RUN_SCRIPT_DIR"
        SERVICE_FILE="$INIT_DIR$SERVICE_NAME"
        echo "String1:$FULL_RUN_SCRIPT_DIR"
        echo "String2:$SEE_FILE_PATH"
        echo "String3:$SERVICE_FILE"

        perl -p -i -e "s/$FULL_RUN_SCRIPT_DIR/$SEE_FILE_PATH/g" "$SERVICE_FILE"

しかし、エラーが発生します。

String1:FULL_RUN_SCRIPT_DIR
String2:/etc/rc.d/init.d/seelinkdeployer
String3:/etc/rc.d/init.d/seelinkdeployer
Bareword found where operator expected at -e line 1, near "s/FULL_RUN_SCRIPT_DIR//etc"
syntax error at -e line 1, near "s/FULL_RUN_SCRIPT_DIR//etc"
Execution of -e aborted due to compilation errors.

どんなアイデアがありますか?

ベストアンサー1

何かが間違っているという最初のヒントは、次のような場合です。

...near "s/FULL_RUN_SCRIPT_DIR//etc"

...次のような表現が必要なとき

...near "s/FULL_RUN_SCRIPT_DIR//etc/rc.d/init.d/seelinkdeployer/g"

...全体の価値があります$SEE_FILE_PATH

問題は、Perl演算子で/検索テキストとs//代替テキストを区別するためにスラッシュを使用しており、少なくとも代替テキストにスラッシュがあることです。

いくつかのオプションがあります。

  1. でスラッシュを区切り文字として使用しないでくださいs//。検索テキストを使用するか、テキストにない内容を置き換えます。たとえば、~:

    perl -p -i -e "s~$FULL_RUN_SCRIPT_DIR~$SEE_FILE_PATH~g" "$SERVICE_FILE"
    
  2. 検索および/または代替テキストでエスケープされたスラッシュをスラッシュに置き換えます(//パラメータ拡張がbashに似たシェルを使用していると仮定)。

    SEE_FILE_PATH=/etc/rc.d/init.d/seelinkdeployer
    SEE_FILE_PATH=${SEE_FILE_PATH//\//\\/}
    

追加資料:

おすすめ記事