Replace

如何遞歸替換文件中所有匹配的字元串?

  • September 10, 2022

文件夾名稱站點中大約有 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遞歸替換的任何工具/命令?

Ps:對不起,現在正在做一個masos。

您可以嘗試使用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' {} +

便攜:

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

引用自:https://unix.stackexchange.com/questions/716768