使用斜杠递归搜索和替换命令行?

时间:2015-01-23 20:35:52

标签: perl

我需要运行搜索并替换类似命令的命令:

s3.amazonaws.com/username/

更改为:

something.cloudfront.net

在整个主目录文件夹和文件中:

/home/username/
/home/username/folder
/home/username/folder/js
/home/username/folter/file.php    
etc.

我该怎么做?文件有不同的扩展名,如.php和.js等,所以我需要替换所有文件,如

*.*

我找到了一种通过perl命令行替换它的方法,但是因为“/”斜杠而无法正常工作。

perl -p -i -e 's/s3.amazonaws.com/username//something.cloudfront.net/g' `find ./ -name *`

2 个答案:

答案 0 :(得分:2)

这是一个使用curlie括号作为分隔符的示例,并且更加小心来自find的参数。你知道,你必须注意文件名中的空格和特殊字符。

find . -type f -print0 |
   xargs -0 perl -i -pe's{\Qs3.amazonaws.com/username/}{something.cloudfront.net}g'

在POSIX系统上,您甚至不需要xargs

find . -type f -exec \
   perl -i -pe's{\Qs3.amazonaws.com/username/}{something.cloudfront.net}g' {} +

(\ Q使'。'字符的意思是“一个点”而不是“一个任何东西”)。

答案 1 :(得分:0)

perl中的递归文件遍历最好用File::Find完成。这允许您指定一个回调 - 在每个文件上执行的子例程。

但是,如果您真的开始使用perl-as-sed,我是否可以指出您可以使用非斜杠作为分隔符。

s/somepattern/some_other_pattern/g;

在功能上等同于:

s,somepattern,some_other_pattern,g;

或者你可以逃避'带有反斜杠的斜杠,但为了清晰起见,我更喜欢使用不同的分隔符。

所以你的模式:

's/s3.amazonaws.com/username//something.cloudfront.net/g'

会变成:

's,s3.amazonaws.com/username/,something.cloudfront.net,g'

(假设我已经在中间'斜线'在正确的位置)