Search
如何在 unix/linux 系統上從命令行遞歸搜尋和替換
所以我想用一個命令同時更改幾個文件。這是我到目前為止所擁有的:
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 同上。