用sed / perl替换特殊字符时出错

时间:2012-09-21 16:17:30

标签: perl shell unix sed nawk

我正在尝试使用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

在这种情况下,我通过逃避有问题的角色来获得期望。

除了逃避特殊字符外,你能告诉我如何避免这种解释吗?

由于


在William的投入之后,我能够毫无错误地实现以下目标:

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!& %^ $ @ & ^%取代文件。

由于特殊字符未被转义,我认为不会发生替换。但我不想使用转义来逃避特殊字符。你可以用文件中的特殊字符替换字符串来帮助我一些其他的方法吗?

由于

1 个答案:

答案 0 :(得分:0)

在perl中,避免任何插值的一种简单方法是使用'作为分隔符。例如

perl -pe "s'OLD_STRING'mogga_dev_\$%^'"

在这种情况下,我们必须转义$才能将字符串mogga_dev_$%^转换为perl,但这可能会对您有所帮助。我不清楚你试图避免添加转义字符的确切字符串,如果你在字符串mogga_dev_$%^中有字符串NEW_STRING,你可以这样做:

perl -pe "s'"$OLD_STRING"'"$NEW_STRING"'"