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

Chr*_*man 5 linux sed macos

我有大量文件需要替换完整的 URL 方案。某些文件名包含空格。经过大量的搜索、真实和错误,这是我最接近的:

find /somedir -type f -print0 -exec sed -i'' -e 's#http\\:\\/\\/domain.com#https\\:\\/\\/www.domain.com#g' {} +
Run Code Online (Sandbox Code Playgroud)

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

此外,创建一个新文件,附加-e到文件名。- 即some file.php-e显然不需要。

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

任何想法都非常感谢!

cha*_*aos 3

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

find /dir -type f -print0 | xargs -0 sed -i 's#http://domain.com#https://www.domain.com#g'
Run Code Online (Sandbox Code Playgroud)

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

find /dir -type f -exec sed -i 's#http://domain.com#https://www.domain.com#g' {} +
Run Code Online (Sandbox Code Playgroud)

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

解决方案 3:除了 之外sed,您还可以使用perlsearch-replace-job:

perl -i -pe 's#http://domain.com#https://www.domain.com#g' file
Run Code Online (Sandbox Code Playgroud)

find与/命令结合xargs

find /dir -type f -print0 | xargs -0 perl -i -pe 's#http://domain.com#https://www.domain.com#g'
Run Code Online (Sandbox Code Playgroud)