如何用awk或sed遞歸查找/替換字符串?

我如何查找和替換每次出現的狀況: git

subdomainA.example.com

dom

subdomainB.example.com

/home/www/目錄樹下的每一個文本文件中遞歸? spa


#1樓

cd /home/www && find . -type f -print0 |
  xargs -0 perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g'

#2樓

find /home/www \( -type d -name .git -prune \) -o -type f -print0 | xargs -0 sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g'

-print0告訴find打印以空字符而不是換行符分隔的每一個結果。 若是您的目錄中的文件名中帶有換行符,這種狀況極有可能發生,這仍然使xargs能夠使用正確的文件名。 命令行

\\( -type d -name .git .prune \\)是一個表達式,它徹底跳過名爲.git全部目錄。 若是使用SVN或要保留其餘文件夾,則能夠輕鬆擴展它-只需與更多名稱匹配便可。 它大體等效於-not -path .git ,但效率更高,由於它沒有檢查目錄中的每一個文件,而是徹底跳過了它。 因爲-prune實際工做方式,所以必須-prune -ocode

有關更多信息,請參見man find遞歸


#3樓

find /home/www/ -type f -exec perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g' {} +

find /home/www/ -type f將列出/ home / www /(及其子目錄)中的全部文件。 「 -exec」標誌告訴find在找到的每一個文件上運行如下命令。 索引

perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g' {} +

是在文件上運行的命令(一次運行)。 {}被替換爲文件名。 命令末尾的+指示find爲多個文件名構建一個命令。 it

按照find手冊頁:「命令行的構建與xargs生成命令行的方式幾乎相同。」 效率

所以,無需使用xargs -0-print0便可實現您的目標(並處理包含空格的文件名)。 擴展


#4樓

注意 :請勿在包含git repo的文件夾上運行此命令-更改.git可能會損壞git索引。

find /home/www/ -type f -exec \
    sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g' {} +

與這裏的其餘答案相比,它比大多數答案更簡單,而且使用sed代替了perl,這是原始問題的要求。


#5樓

一種更簡單的方法是在命令行上使用如下內容

find /home/www/ -type f|xargs perl -pi -e 's/subdomainA\.example\.com/subdomainB.example.com/g'
相關文章
相關標籤/搜索