轉帖-Linux下如何同時替換多個文件中的文本或字符串

做者:吉慶( qingfang0515@sina.com )
主頁:http://hi.baidu.com/jiqing0925
轉載請保留做者信息。
-------------------
作一件比較複雜的事一般存在多種方法。
一次性替換多個文件中的文本是咱們常遇到的問題,下面是解決這個問題的三種方法:

1. vi 方法
參見vim用戶手冊26.
*26.3* 改動多個文件

假定你有個變量名爲 x_cnt 而你要把他改成 x_counter。
這個變量在多個 C 文件都被用到了。你須要在全部文件中做此改動。你得這麼作。
把全部相關文件放進參數列表:

:args *.c

這個命令會找到全部的 C 文件並編輯其中的第一個。
如今你能夠對全部這些文件執行置換命令:

:argdo %s/\<x_cnt\>/x_counter/ge | update

命令 :argdo 把另外一個命令看成其參數。然後者將對參數列表內全部的文件執行。
做爲參數的替換命令 %s 做用於全部文本行。它用 \<x_cnt\> 來查找x_cnt。
\< 和 \> 用來指定僅匹配那些完整的詞,而不是 px_cnt 或x_cnt2。

替換命令的標記中包含 g,用以置換同一行文本內出現的全部的匹配詞 x_cnt。
標記 e 用於避免因文件中找不到 x_cnt 而出現錯誤信息。
不然 :argdo 命令就會在遇到第一個找不到 x_cnt 的文件時中斷。
字符 | 分隔兩條命令。後面的 update 命令將那些有改動的文件存盤。
若是沒有 x_cnt 被改爲 x_counter,這個命令什麼也不作。

還有一個 :windo 命令,用於在全部視窗內執行其參數所規定的命令。
以及 :bufdo命令,對全部緩衝執行其參數所規定的命令。
使用中要當心,由於你在緩衝列表中的文件數量可能超過你能想像的。
請用 :buffers 命令 (或 :ls) 來檢查緩衝列表。

2. perl方法
能夠在命令行下進行替換,
仍然以vi方法中的例子進行講解,把c文件中的x_cnt 改成 x_counter。
能夠執行如下命令:
find . -name '*.c' -print0 | xargs -0 perl -pi -e 's/x_cnt/x_counter/g'

xargs 把find命令的結果做爲perl的參數。
find的參數-print0和xargs的參數-0是防止文件名中有空格或新行形成錯誤,能夠man xargs得到幫助。

html

注意: 若是替換的字符包括 ()[]/'!? 等等這樣的特殊字符,你必須在字符前加上反斜槓\ 。vim

這種方法的好處是不用啓動編輯器,比較迅速。缺點是容易出現不想要的替換,例如:把px_cnt替換成了px_counter。編輯器

3. sed
仍以上面的例子講解:
find . -name *.c -print0 | xargs -0 sed -i 's/x_cnt/x_counter/g'
優缺點和perl方法相同。

以上方法的差別只在於使用工具的不一樣,相信確定還有別的工具能辦到這件事。
好比emacs,確定也能作到這些,只是由於我不用emacs,因此不熟悉。
但願你們總結本身駕輕就熟的方法。工具

==================
Linux sed批量替換多個字符串

http://www.itqun.net/content-detail/105074.html

好比,要將目錄/modules下面全部文件中的zhangsan都修改爲lisi,這樣作:

sed -i s/zhangsan/lisi/g `grep zhangsan -rl /modules`

解釋一下:

-i 表示inplace edit,就地修改文件
-r 表示搜索子目錄
-l 表示輸出匹配的文件名

這個命令組合很強大,要注意備份文件。


(1)sed 'y/1234567890/abCDEFGHIJ/' test_sed

sed 'y/1234567890/abCDEFGHIJ/' filename
abCDEFGHIJ
BCDEFGHIJA
CDEFGHIJAB
DEFGHIJABC
注意變換關係是按兩個list的位置對應變換

其中:test_sed的內容是:

1234567890
2345678901
3456789012
4567890123


(2)替換每行全部匹配

sed 's/01/Ab/g' test_sed
1234567890
23456789Ab
3456789Ab2
456789Ab23
注意:第一行的0,1沒有分別替換爲A,b




刪除:d命令

        *

          $ sed '2d' example-----刪除example文件的第二行。
        *

          $ sed '2,$d' example-----刪除example文件的第二行到末尾全部行。
        *

          $ sed '$d' example-----刪除example文件的最後一行。
        *

          $ sed '/test/'d example-----刪除example文件全部包含test的行。

替換:s命令

        *

          $ sed 's/test/mytest/g' example-----在整行範圍內把test替換爲mytest。若是沒有g標記,則只有每行第一個匹配的test被替換成mytest。
        *

          $ sed -n 's/^test/mytest/p' example-----(-n)選項和p標誌一塊兒使用表示只打印那些發生替換的行。也就是說,若是某一行開頭的test被替換成mytest,就打印它。
        *

          $ sed 's/^192.168.0.1/&localhost/' example-----&符號表示替換換字符串中被找到的部份。全部以192.168.0.1開頭的行都會被替換成它自已加 localhost,變成192.168.0.1localhost。
        *

          $ sed -n 's/\(love\)able/\1rs/p'spa

相關文章
相關標籤/搜索