如何递归替换文件中所有匹配的字符串?

如何递归替换文件中所有匹配的字符串?

文件夹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。xargsgrepgrep

答案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”

学分:

如何使用find命令搜索多个扩展名,

带有 -i 选项的 sed 命令在 Mac 上失败

笔记:我不确定这段代码是否适用于 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'

请注意上面斜杠的转义。

相关内容