我有一個包含許多文本文件的目錄層次結構。我想在每次出現在其中一個文件中時搜索特定的文本字符串,並用另一個字符串替換它。例如,我可能想用「百事可樂」替換字符串「可樂」的每一個字母。有誰知道如何做到這一點?我想知道是否有某種Bash命令可以做到這一點,而無需在編輯器中加載所有這些文件,或者想出一個更復雜的腳本來做到這一點。Bash:任何命令來替換文本文件中的字符串?
我發現this page解釋了一個使用sed的技巧,但它似乎不適用於子目錄中的文件。
我有一個包含許多文本文件的目錄層次結構。我想在每次出現在其中一個文件中時搜索特定的文本字符串,並用另一個字符串替換它。例如,我可能想用「百事可樂」替換字符串「可樂」的每一個字母。有誰知道如何做到這一點?我想知道是否有某種Bash命令可以做到這一點,而無需在編輯器中加載所有這些文件,或者想出一個更復雜的腳本來做到這一點。Bash:任何命令來替換文本文件中的字符串?
我發現this page解釋了一個使用sed的技巧,但它似乎不適用於子目錄中的文件。
使用sed
結合find
。例如:
find . -name "*.txt" | xargs sed -i s/Coke/Pepsi/g
或
find . -name "*.txt" -exec sed -i s/Coke/Pepsi/g {} \;
(參見找到更多信息手冊頁)
另外,如果您使用'find'和'xargs'的組合,特別是在腳本中,最好使用'find -print0'和'xargs -0'來防止名稱中包含空格的文件 – 2010-05-18 19:09:06
我嘗試了你的第一個建議,它工作。謝謝。 – 2010-05-18 19:24:51
@ mikez302:請考慮Martin的評論。 'xargs'通常不是必需的,通常應該使用'-0'開關。第二種解決方案好得多。 – Philipp 2010-06-28 09:29:59
我通常做它用Perl。但是當心 - 它使用正則表達式,這是更強大的那麼正常的字符串替換:
% perl -pi -e 's/Coke/Pepsi/g;' $filename
編輯我忘了子目錄
% find ./ -exec perl -pi -e 's/Coke/Pepsi/g;' {} \;
IMO,用最簡單的使用工具這一任務rpl
:
rpl -R Coke Pepsi .
(-R
是在所有SUBD遞歸更換irectories)
鏈接:[原創](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
@丹尼斯:謝謝!我應該考慮添加其中至少一個。 – 2010-05-18 19:54:50
聯合收割機的sed有發現這樣的:
find . -name "file.*" -exec sed -i 's/Coke/Pepsi/g' {} \;
find . -type f -exec sed -i 's/old-word/new-word/g' {} \;
你想和find
組合sed
我討厭當這種情況發生。四個答案在3分鐘內非常接近。有時回答這些問題變成一場比賽...非常stresfull ...等待頂部的黃色欄說「加載答案」 – rmarimon 2010-05-18 19:04:34
你們許多人提交的建議,工作。我只是因爲他先回答而接受了發情。 – 2010-05-18 19:25:18