如何使用Perl替换文件中具有转义序列的String?

时间:2010-12-21 10:52:20

标签: regex perl string

如何使用perl替换文件中的String?

perl -pi -e 's/Arun/Brun/g' *

这对我来说很好

但是当我尝试将class/students/a更改为class1/students1/B时,它会抛出错误如何解决此问题..我尝试在每个{\之前添加反斜杠(/) )但它没有帮助

perl -pi -e 's/class/students/a/class1/students1/B/g' *

3 个答案:

答案 0 :(得分:12)

您使用/作为正则表达式分隔符。
即使在模式替换中也有/。您需要以某种方式确保不应将这些/视为分隔符。

您有两种选择:

  1. 模式替换中的/退出:

    perl -pi -e 's/class\/students\/a/class1\/students1\/B/g' *
    
  2. 或者使用不同的分隔符:

    perl -pi -e 's#class/students/a#class1/students1/B#g' *
    
  3. 首选方法2,因为它可以保持正则表达式简短清理

答案 1 :(得分:8)

尝试perl -pi -e 's{class/students/a}{class1/students1/B}g' *

来自perldoc perlop

  

任何非空白分隔符都可以   替换斜杠。之后添加空格   使用允许的角色时的s   在标识符中。 (...)如果   PATTERN由包围区分   引用,REPLACEMENT有自己的   引号,可能会也可能不会   包括引号,例如,   s(foo)(bar)或s / bar /.

答案 2 :(得分:0)

谢谢perldoc perlop:

我的问题是changin Oracle Home已经通过您的命令解决了。我用shell变量替换的另一个技巧。

export ORACLE_HOME=/oracle/product/11.2.0.3/db_1

perl -pi -e 's{REPLACEWITHORACLEHOME}{'$ORACLE_HOME'}g' filename

更多脚本方式是:

for y in `ls`;do perl -pi -e 's{REPLACEWITHORACLEHOME}{'$ORACLE_HOME'}g' $y;done