Search

如何在 unix/linux 系統上從命令行遞歸搜尋和替換

  • April 16, 2016

所以我想用一個命令同時更改幾個文件。這是我到目前為止所擁有的:

find -regex ".*\.ext$" | xargs grep -l searchText 2> /dev/null | xargs -i sed 's/searchText/replaceText/' > {}.new

它能做什麼:

我找到副檔名為 ext 的文件,將其發送到 grep 忽略錯誤,然後將其發送到 sed 以替換為新文件名 file.ext.new。

問題似乎是 sed 中的重定向 > 阻止 {} 被文件名替換。

有任何想法嗎?還是更好的解決方案?

如果您可以忍受正在更新的文件並創建備份。

find -name '*.ext' -exec sed -i'.backup' 's/searchText/replaceText/' {} +

編輯:

如果您絕對不能以這種方式保存文件 - 修改後的文件和帶有副檔名的原始文件 - 那麼您可以在 exec 的末尾添加一個額外的命令來移動它們。

反引號又名。“外部命令”來救援。

sed -i '.bak' 's/searchText/replaceText/g' `grep -l searchText \`find . -name '*.ext'\``

在這裡,我們找到搜尋“*.ext”,然後將其作為文件提供以搜尋 grep,這些 grep 是給 sed 的,它進行實際替換。它的優點是它不會為找到的每個文件生成新的 grep 程序。sed 同上。

引用自:https://serverfault.com/questions/53839