2010-05-18 29 views
3

我有一個包含許多文本文件的目錄層次結構。我想在每次出現在其中一個文件中時搜索特定的文本字符串,並用另一個字符串替換它。例如,我可能想用「百事可樂」替換字符串「可樂」的每一個字母。有誰知道如何做到這一點?我想知道是否有某種Bash命令可以做到這一點,而無需在編輯器中加載所有這些文件,或者想出一個更復雜的腳本來做到這一點。Bash:任何命令來替換文本文件中的字符串?

我發現this page解釋了一個使用sed的技巧,但它似乎不適用於子目錄中的文件。

+1

我討厭當這種情況發生。四個答案在3分鐘內非常接近。有時回答這些問題變成一場比賽...非常stresfull ...等待頂部的黃色欄說「加載答案」 – rmarimon 2010-05-18 19:04:34

+0

你們許多人提交的建議,工作。我只是因爲他先回答而接受了發情。 – 2010-05-18 19:25:18

回答

15

使用sed結合find。例如:

find . -name "*.txt" | xargs sed -i s/Coke/Pepsi/g 

find . -name "*.txt" -exec sed -i s/Coke/Pepsi/g {} \; 

(參見找到更多信息手冊頁)

+6

另外,如果您使用'find'和'xargs'的組合,特別是在腳本中,最好使用'find -print0'和'xargs -0'來防止名稱中包含空格的文件 – 2010-05-18 19:09:06

+0

我嘗試了你的第一個建議,它工作。謝謝。 – 2010-05-18 19:24:51

+1

@ mikez302:請考慮Martin的評論。 'xargs'通常不是必需的,通常應該使用'-0'開關。第二種解決方案好得多。 – Philipp 2010-06-28 09:29:59

2

我通常做它用Perl。但是當心 - 它使用正則表達式,這是更強大的那麼正常的字符串替換:

% perl -pi -e 's/Coke/Pepsi/g;' $filename 

編輯我忘了子目錄

% find ./ -exec perl -pi -e 's/Coke/Pepsi/g;' {} \; 
3

IMO,用最簡單的使用工具這一任務rpl

rpl -R Coke Pepsi . 

-R是在所有SUBD遞歸更換irectories)

+1

鏈接:[原創](http://www.laffeycomputer.com/rpl.html),[ Debian](http://packages.debian.org/search?keywords=rpl),[Ubuntu](http://packages.ubuntu.com/search?suite=all&searchon=names&keywords=rpl),[Fedora](https ://admin.fedoraproject.org/pkgdb/acls/name/rpl?_csrf_token = 4f507dd0ecebb1f7d7ec166507562d25be5a7cef) – 2010-05-18 19:32:59

+0

@丹尼斯:謝謝!我應該考慮添加其中至少一個。 – 2010-05-18 19:54:50

3

聯合收割機的sed有發現這樣的:

find . -name "file.*" -exec sed -i 's/Coke/Pepsi/g' {} \; 
3

find . -type f -exec sed -i 's/old-word/new-word/g' {} \;

2

你想和find組合sed