![如何递归替换文件中所有匹配的字符串?](https://linux22.com/image/210552/%E5%A6%82%E4%BD%95%E9%80%92%E5%BD%92%E6%9B%BF%E6%8D%A2%E6%96%87%E4%BB%B6%E4%B8%AD%E6%89%80%E6%9C%89%E5%8C%B9%E9%85%8D%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%9F.png)
文件夹name site下大约有50个HTML/js文件,
一些文件包含(以下行是从文件组合而来)
{"rendered":"http:\/\/localhost:4542\/?page_id=854"}
http:\/\/localhost:4542\/wp-content\/uploads\/2022\/09\/
src=\"http:\/\/localhost:4542\/wp-content\/uploads\/2022\/09\/B
http:\/\/localhost:4542\/wp-content\/uploads\/2022\/09\/A
replies":[{"embeddable":true,"href":"http:\/\/localhost:4542\/en\/wp-json
是否有任何工具/命令可以在文件夹的所有文件中递归http:\/\/localhost:4542
替换?https:example.com
现在在 macOS 上工作。
答案1
便携:
LC_ALL=C find . '(' -name '*.[Jj][Ss]' -o \
-name '*.[Hh][Tt][Mm][Ll]' -o \
-name '*.[Hh][Tt][Mm]' \
')' -exec perl -pi -e '
s{\Qhttp:\/\/localhost:4542\E}{https:example.com}g' {} +
请注意,它最终会重写甚至没有任何内容可替换的文件。
对于 GNU grep
/xargs
或兼容的(这里是一个带有大括号扩展支持的 shell,以避免过多的输入),可以通过以下方式避免:
LC_ALL=C grep -r --include='*.'{'[jJ][sS]','[Hh][Tt][Mm]'{,'[Ll]'}} \
-Fl --null 'http:\/\/localhost:4542' . |
xargs -r0 perl -pi -e '
s{\Qhttp:\/\/localhost:4542\E}{https:example.com}g'
除了您可以删除而不会造成太大损害-r
的选项(如果找不到文件,只是一个 perl 警告)之外,它也应该适用于复制了大部分 GNU API 的 Macos。xargs
grep
grep
答案2
find
您可以尝试使用带有参数的命令-exec
:
find /path/to/folder -type f -regex '.*\.\(js\|html\)' -exec sed -i 's#http:\\/\\/localhost:4542#https:example.com#g' {} +
在 Mac OS 上,您可以使用类似的语法:
find /path/to/folder -E -type f -regex '.*\.(js|html)' -exec sed -i '.bak' 's#http:\\/\\/localhost:4542#https:example.com#g' {} +
我真的希望它可以工作,我没有 Mac 来测试它,但它应该可以工作。在 Mac OS 上,当您指定该-i
选项时,需要备份文件扩展名。您可以使用任何值代替“.bak”
学分:
笔记:我不确定这段代码是否适用于 Mac OS,但你也可以尝试一下:
find /path/to/folder -iname "*.html" -o -iname "*.js" -exec sed -i 's#http:\\/\\/localhost:4542#https:example.com#g' {} +
答案3
您可以使用find
来查找*.txt
给定文件夹(例如 )中特定类型(例如 )的所有文件.
,然后sed
使用以下命令将它们输入命令中xargs
:
find . -type f -name '*.txt' -print0 | xargs -0 sed -i 's/http:\\\/\\\/localhost:4542/https:example.com/g'
请注意上面斜杠的转义。