我正在尝试使用 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 }'
我看到字符串OLD_STRING应该被替换为字符串mogga_dev_$%^被替换为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!& %^$@ &^%替换。
由于特殊字符没有转义,我认为没有发生替换。但我不想使用转义来转义特殊字符。你能帮我用其他方法用文件中的特殊字符替换字符串吗?
谢谢