我有来自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/!'
特别感叹号和"
。谢谢!
答案 0 :(得分:3)
-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/
的行。