2009-02-09 77 views
33

這樣做的最好方法是什麼?我不是命令行戰士,但我想這可能是一種使用grep和cat的方式。在幾個文件中查找/替換的最佳方法?

我只想替換髮生在文件夾和子文件夾中的字符串。最好的辦法是什麼?如果有問題,我正在運行Ubuntu。

-d

+0

剛剛要離開這個鏈接就在這裏:http://stackoverflow.com/questions/102083/whats-the-best-tool-to-find-and-replace-regular-expressions-over-multiple-files – 2012-06-07 02:59:56

回答

36
find . -type f -print0 | xargs -0 -n 1 sed -i -e 's/from/to/g' 

的第一部分是一個find命令找到你要更改的文件。您可能需要適當修改。 「xargs」命令將找到找到的每個文件並將「sed」命令應用於該文件。 「sed」命令使用「from」的每個實例並將其替換爲「to」。這是一個標準的正則表達式,可以根據需要進行修改。

如果您使用svn小心。您的.svn目錄將被搜索並替換。你必須排除那些,例如,像這樣:

find . ! -regex ".*[/]\.svn[/]?.*" -type f -print0 | xargs -0 -n 1 sed -i -e 's/from/to/g'

find . -name .svn -prune -o -type f -print0 | xargs -0 -n 1 sed -i -e 's/from/to/g'

+0

它似乎並不像這個命令遞歸到子目錄中。有什麼我做錯了嗎? – blackrobot 2009-02-09 19:16:38

+0

是什麼讓你覺得它不是遞歸到目錄中? – 2009-02-09 19:24:02

37

正如保羅說,你想先找到你想要編輯,然後編輯該文件。使用找到一個替代方案是使用GNU的grep(在Ubuntu默認的),例如:

grep -r -l from . | xargs -0 -n 1 sed -i -e 's/from/to/g' 

您還可以使用ACK-的grep(命令和apt-get安裝ACK-的grep或訪問http://petdance.com/ack/)爲好,如果你知道你只想要某種類型的文件,並且想要忽略版本控制目錄中的東西。例如,如果你只想文本文件,

ack -l --print0 --text from | xargs -0 -n 1 sed -i -e 's/from/to/g' 
# `from` here is an arbitrary commonly occurring keyword 

使用sed的另一種方法是用perl可以按命令處理多個文件,例如,

grep -r -l from . | xargs perl -pi.bak -e 's/from/to/g' 

這裏,是用perl告訴編輯放置,首先製作一個.bak文件。

根據您的喜好,您可以將管道的任何左側與右側結合使用。

3

sed的方法是使用rpl(例如可以從http://rpl.sourceforge.net/或您的GNU/Linux發行版),喜歡rpl --recursive --verbose --whole-words 'F' 'A' grades/

14

我會在另一個例子中拋出使用Ag, The Silver Searcher做找人/替換多個文件操作。

完整的示例:

ag -l "search string" | xargs sed -i '' -e 's/from/to/g' 

如果我們打破這種下來,我們得到的是:

# returns a list of files containing matching string 
ag -l "search string" 

接下來,我們有:

# consume the list of piped files and prepare to run foregoing command 
# for each file delimited by newline 
xargs 

最後,該字符串替換命令:

# -i '' means edit files in place and the '' means do not create a backup 
# -e 's/from/to/g' specifies the command to run, in this case, 
# global, search and replace 

sed -i '' -e 's/from/to/g' 
相關問題