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_STRINGmogga&*%^$ 取代,但它正在被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!& %^$@ &^%替换。

由于特殊字符没有转义,我认为没有发生替换。但我不想使用转义来转义特殊字符。你能帮我用其他方法用文件中的特殊字符替换字符串吗?

谢谢

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 回答