我需要运行搜索并替换类似命令的命令:
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 *`
答案 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'
(假设我已经在中间'斜线'在正确的位置)