2012-11-13 28 views
3

我有數百個文件需要更改其文本的一部分。批量替換文本文件內的文本(Linux/OSX命令行)

例如,我想用「rtmp://」替換「http://」的每個實例。

這些文件具有.txt擴展名,分佈在多個文件夾和子文件夾中。

我基本上正在尋找一種方式/腳本去槽每個文件夾/子文件夾和每一個單一的文件,如果它發現內部文件的「http」發生替換爲「rtmp」。

回答

9

您可以用findsed組合做到這一點:

find . -type f -name \*.txt -exec sed -i.bak 's|http://|rtmp://|g' {} + 

這將創建每個文件的備份。我建議你檢查了幾個,以確保它沒有你想要的東西,那麼你可以使用

find . -name \*.bak -delete 
+0

感謝快回答!但是,如何將命令限制爲只有.txt文件?因爲我在文件夾中有其他文件,jpgs等。 – user1596553

+0

將'-name'參數添加到'find',我已經編輯它 – Kevin

+0

@ user1596553改變凱文的腳本到'find。 -type f -name'* .txt'-exec sed -i.bak'| http:// | rtmp:// | g'{} +' –

2

這裏有一個zsh功能我用這樣做刪除:

change() { 
     from=$1 
     shift 
     to=$1 
     shift 
     for file in $* 
     do 
       perl -i.bak -p -e "s{$from}{$to}g;" $file 
       echo "Changing $from to $to in $file" 
     done 
} 

它使用的很好的Perl機制來創建備份文件並修改指定的文件。您可以使用上面的文件,通過這樣迭代:

zsh$ change http:// rtmp:// **/*.html 

或者只是把它放在一個平凡的#!/bin/zsh腳本(我只是使用的zsh爲強大的通配)