2012-01-18 226 views
1

我試圖在給定主目錄和子目錄中的所有文檔中將「my-silly-home-page-name.html」的名稱更改爲「index.html」 。unix在目錄和子目錄中查找和替換文本

我看到了這個:Shell script - search and replace text in multiple files using a list of strings

這:How to change all occurrences of a word in all files in a directory

我已經試過這樣:

grep -r "my-silly-home-page-name.html" . 

這個發現在其上文字存在的線,但現在我想代替「我傻,家庭PAGE-名稱'爲'索引'。 我如何使用sed或perl來做到這一點? 或者我甚至需要sed/perl?

喜歡的東西:

grep -r "my-silly-home-page-name.html" . | sed 's/$1/'index'/g' 

另外;我用Perl想這一點,我嘗試以下方法:

perl -i -p -e 's/my-silly-home-page-name\.html/index\.html/g' * 

這工作,但我得到一個錯誤,當遇到perl的目錄,說「無法做到就地編輯:SOMEDIR-NAME不是一個普通文件,<>線N」

感謝, JML

+0

可能的重複:http://stackoverflow.com/questions/8905662/how-to-change-all-occurances-of-a-word-in-all- files-in-a-directory/ – 2012-01-18 19:41:01

+0

我也在問一個關於perl的問題,一般來說,進入另一種方法的好處是什麼。 – jml 2012-01-18 19:47:26

+0

我也特別想知道有關目錄的perl問題的解決方案... – jml 2012-01-18 19:50:14

回答

6
find . -type f -exec \ 
    perl -i -pe's/my-silly-home-page-name(?=\.html)/index/g' {} + 

或者,如果您find不支持-exec +

find . -type f -print0 | xargs -0 \ 
    perl -i -pe's/my-silly-home-page-name(?=\.html)/index/g' 

兩個傳遞到Perl作爲參數作爲在時間儘可能多的名字。兩者都可以使用任何文件名,包括那些包含換行符的文件名。


如果您使用的是Windows,並且您使用的Perl的Windows版本(而不是一個cygwin編譯),-i不會工作,除非你還做原來的備份。將-i更改爲-i.bak。你可以去刪除備份使用

find . -type f -name '*.bak' -delete 
+0

,它工作得更好(至少它寫入更多的文件),但我仍然得到關於「無法就地編輯」的錯誤。 – jml 2012-01-18 19:58:45

+0

@jml,更新了我對地址「無法就地編輯」的答案。 – ikegami 2012-01-18 20:04:40

+0

謝謝。非常感激! – jml 2012-01-18 20:20:23

1

這應該做的工作:

find . -type f -print0 | xargs -0 sed -e 's/my-silly-home-page-name\.html/index\.html/g' -i 

基本上它遞歸集人l來自給定目錄(示例中爲.)的文件爲find,並運行sed,其中中的問題與perl命令中的命令具有相同的替換命令。

關於sedperl的問題,我想說你應該使用一個更舒服的問題,因爲我不期望有很大的差異(替代命令畢竟是相同的)。

0

可能有更好的方法來做到這一點,但你可以使用:

find . -name oldname.html |perl -e 'map { s/[\r\n]//g; $old = $_; s/oldname.txt$/newname.html/; rename $old,$_ } <>'; 

據透露,grep的搜索模式; 找到搜索文件。

相關問題