将文件中的字符串替换为另一个字符串

将文件中的字符串替换为另一个字符串

我试图在 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

您遇到的问题是,您使用正斜杠/将搜索文本与 Perls//运算符中的替换文本分开,并且至少在您的替换文本中存在正斜杠。

您有几个选择:

  1. 不要使用正斜杠作为s//;中的分隔符使用搜索文本或替换文本中不存在的内容。例如,~

    perl -p -i -e "s~$FULL_RUN_SCRIPT_DIR~$SEE_FILE_PATH~g" "$SERVICE_FILE"
    
  2. 将搜索和/或替换文本中的转义斜杠替换为斜杠(假设//参数扩展使用类似 bash 的 shell):

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

进一步阅读:

相关内容