【发布时间】:2012-09-21 16:17:29
【问题描述】:
我正在尝试使用 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!&%^$@&^%。
由于特殊字符没有被转义,我认为替换不会发生。但我不想使用转义来转义特殊字符。你能帮我用其他方法用文件中的特殊字符替换字符串吗?
谢谢
【问题讨论】: