请解释一行perl代码

时间:2014-07-14 20:31:09

标签: perl sed

我有来自https://camlistore.googlesource.com/camlistore/+/master/third_party/rewrite-imports.sh

的这一行
find . -type f -name '*.go' -exec perl -pi -e 's!"code.google.com/!"camlistore.org/third_party/code.google.com/!' {} \;

我想帮助理解这究竟是什么:

perl -pi -e 's!"code.google.com/!"camlistore.org/third_party/code.google.com/!'

特别感叹号和"。谢谢!

3 个答案:

答案 0 :(得分:3)

来自perldoc perlrun

  • -p表示“为每一行运行表达式,并打印结果”
  • -i表示“编辑输入文件”
  • -e表示“下一个参数是要评估的Perl表达式”

表达式本身:

  • !标记是s(替换)运算符的分隔符。 可以使用任何非字母数字字符 - 无论s后面是什么。
  • "个字符并不代表任何特殊内容,它们只是要替换的文本的一部分,而且是替换。

所以我们有:

  • s:替换
  • ! :(分隔符)
  • "code.google.com/:要查找的文字
  • ! :(分隔符)
  • "camlistore.org/third_party/code.google.com/:替换文字
  • ! :(分隔符)

一切都意味着:

  • 对于文件中的每一行
  • 找到文字"code.google.com/
  • 并且(如果找到)将其替换为"camlistore.org/third_party/code.google.com/

答案 1 :(得分:1)

刘海!只是搜索和替换正则表达式s///的替代分隔符。

因为搜索和替换的内容包含正斜杠,所以使用不同的分隔符以避免必须将它们全部转义是有意义的。感叹号有时会用于此目的s!!!,但我的首选替代方法是大括号:s{}{}

至于代码的执行情况,它会在找到的文件中用"code.google.com/替换"camlistore.org/third_party/code.google.com/的所有引用。

答案 2 :(得分:1)

这是一个非常简单的搜索和替换。 s/PATTERN/REPLACEMENT/运算符查看字符串是否与正则表达式模式匹配,并替换与替换字符串的值匹配的部分。

由于有时/字符是一个不方便的分隔符(例如处理Web URI),Perl允许您将它们换成其他字符,在这种情况下,他们选择使用!

-p开关使Perl围绕有问题的代码假设一个循环来处理行。 -i开关允许输入行在处理时就地编辑,可选择在另一个文件中保留原始行。 (有关血腥的详细信息,请参阅perldoc perlrun。)

因此,所有这些代码都在用"code.google.com/替换包含"camlistore.org/third_party/code.google.com/的行。