我正在尝试使用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!& %^ $ @ & ^%取代文件。
由于特殊字符未被转义,我认为不会发生替换。但我不想使用转义来逃避特殊字符。你可以用文件中的特殊字符替换字符串来帮助我一些其他的方法吗?
由于
答案 0 :(得分:0)
在perl中,避免任何插值的一种简单方法是使用'
作为分隔符。例如
perl -pe "s'OLD_STRING'mogga_dev_\$%^'"
在这种情况下,我们必须转义$
才能将字符串mogga_dev_$%^
转换为perl,但这可能会对您有所帮助。我不清楚你试图避免添加转义字符的确切字符串,如果你在字符串mogga_dev_$%^
中有字符串NEW_STRING
,你可以这样做:
perl -pe "s'"$OLD_STRING"'"$NEW_STRING"'"