Replace
如何遞歸替換文件中所有匹配的字元串?
文件夾名稱站點中大約有 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’學分:
**注意:**我不確定此程式碼是否可以在 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