【问题标题】:Find and replace text with slash characters用斜线字符查找和替换文本
【发布时间】:2012-08-27 15:09:26
【问题描述】:
所以我在 Stackoverflow 上环顾四周,发现查找和替换文本的工作原理如下:
perl -pi -w -e 's/www.example.com/www.pressbin.com/g;' *.html
但是,如果我要查找和替换的文本是带有斜杠的文件路径怎么办?那我该怎么做呢?
perl -pi -w -e 's/path/to/file/new/path/to/file/g;' *.html
【问题讨论】:
标签:
regex
string
perl
replace
slash
【解决方案1】:
perl -pi -w -e 's/path\/to\/file/new\/path\/to\/file/g;' *.html
【解决方案2】:
使用 perl 正则表达式,您可以使用 任何 字符作为正则表达式分隔符,但空格除外
-
\w 中的字符(所以s xfooxbarx 与s/foo/bar/ 相同)和
- 问号
?(隐式激活仅匹配一次行为,已弃用)和
- 单引号
'...'(变量插值的转数)
应该避免。我更喜欢花括号:
perl -pi -w -e 's{path/to/file}{new/path/to/file}g;' *.html
分隔符可能不会出现在各自的字符串中,除非它们是平衡大括号或正确转义。所以你可以也说
perl -pi -w -e 's/path\/to\/file/new\/path\/to\/file/g;' *.html
但这太丑了。
当使用大括号/括号等时,正则表达式和替换之间可以有空格,从而允许像这样漂亮的代码
$string =~ s {foo}
{bar}g;
在这种情况下,另一个有趣的正则表达式选项是quotemeta 函数。如果您的搜索表达式包含许多通常会被解释为具有特殊含义的字符,我们可以将该字符串包含在 \Q...\E 中。所以
m{\Qx*+\E}
匹配确切的字符串x*+,即使包括*、'+'或|等字符。
【解决方案3】:
您可以使用“/”以外的其他字符来指定模式。例如:
perl -pi -w -e 's,path/to/file,new/path/to/file,g;' *.html