【问题标题】:Getting error in substituting special characters with sed/perl用 sed/perl 替换特殊字符时出错
【发布时间】: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!&%^$@&^%

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

谢谢

【问题讨论】:

    标签: perl shell unix sed nawk


    【解决方案1】:

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

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

    在这种情况下,我们必须将$ 转义以将字符串mogga_dev_$%^ 输入perl,但也许这可以帮助您。我不清楚您要避免向哪些字符串添加转义字符,如果您在字符串NEW_STRING 中有字符串mogga_dev_$%^,您可以这样做:

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

    【讨论】:

    • 我想避免在我的字符串中的所有字符中添加转义字符。在这种情况下,shell/perl 不应将它们解释为变量,而应将它们视为纯字符串。在我的 sed 案例中,& 正在被解释。如果 Perl $% 被解释为 0。我想避免所有这些而不在字符串中添加转义字符。
    • 我尝试了上面给出的方法,但没有成功。 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'" bash: !: 未找到事件
    • mogga!&*%^ 放入一个变量中,然后使用它。您没有将字符串 mogga!&*%^ 传递给 perl。
    • 我已经更新了我的问题。你能看一下吗?
    猜你喜欢
    • 2019-09-07
    • 2021-06-11
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    相关资源
    最近更新 更多