使用 sed 和 URL 进行递归查找替换

使用 sed 和 URL 进行递归查找替换

我有一大堆文件需要替换其中的完整 URL 方案。有些文件名包含空格。经过多次搜索和尝试,我找到了最接近的答案:

find /somedir -type f -print0 -exec sed -i'' -e 's#http\\:\\/\\/domain.com#https\\:\\/\\/www.domain.com#g' {} +

生成的文件已http:删除方案,只剩下//- 即“//www.domain.com”

此外,还会创建一个新文件,并将其附加-e到文件名中。 -some file.php-e这显然是不受欢迎的。

虽然这肯定足够了(删除文件后*-e,我内心的强迫症真的想知道如何正确地做到这一点。注意:我在 Mac 上本地工作,但也将在 Linux 上执行此操作。

非常感谢您的任何想法!

答案1

解决方案 1:一种方法是find使用xargs

find /dir -type f -print0 | xargs -0 sed -i 's#http://domain.com#https://www.domain.com#g'

解决方案 2:另一个方法是使用find-exec与您的问题非常相似:

find /dir -type f -exec sed -i 's#http://domain.com#https://www.domain.com#g' {} +

两种解决方案都将sed使用多个文件作为参数进行调用。因此,sed不是对每个文件调用一次,而是对每组文件调用一次。

解决方案 3:除了sed,您还可以使用perl以下搜索替换作业:

perl -i -pe 's#http://domain.com#https://www.domain.com#g' file

结合find/xargs命令:

find /dir -type f -print0 | xargs -0 perl -i -pe 's#http://domain.com#https://www.domain.com#g'

相关内容