Linux中替換文字中的字串
方法有二:
(一)通過vi編輯器來替換。
參考博文:
http://www.linuxdiyf.com/viewarticle.php?id=99843
http://kingaragorn.javaeye.com/blog/467308
vi/vim 中可以使用 :s 命令來替換字串。以前只會使用編輯軟體進行替換,今天發現該命令有很多種寫法(vi真是強大啊,還有很多需要學習),記錄幾種在此,方便以後查詢。
:s/well/good/ 替換當前行第一個 well 為good
:s/well/good/g 替換當前行所有 well 為 good
:n,$s/well/good/ 替換第 n 行開始到最後一行中每一行的第一個 well 為 good
:n,$s/well/good/g 替換第 n 行開始到最後一行中每一行所有 well 為 good
n 為數字,若 n 為 .,表示從當前行開始到最後一行
:%s/well/good/(等同於 :g/well/s//good/) 替換每一行的第一個 well 為 good
:%s/well/good/g(等同於 :g/well/s//good/g)替換每一行中所有 well 為 good
:s#well/#good/# 替換當前行第一個 well/ 為 good/
:%s#/usr/bin#/bin#g
可以把檔案中所有路徑/usr/bin換成/bin
(二)Sumly法直接替換檔案中的字串。(此法不用開啟檔案即可替換字串,而且可以批量替換多個檔案。)
參考博文: http://easytech.javaeye.com/blog/316948
例1
執行命令:
perl -p -i -e "s/China/Sumly/g" /www/*.htm /www/*.txt
上面的意思是說將www資料夾下所有的htm和txt檔案中的“China”都替換為“Sumly”
例2
執行命令:
perl -p -i -e "s/memory_production/memory_production2/g"./*.sql
上面的意思是將當前目錄下所有的sql檔案中的“memory_production”替換成“memory_production2”
======================================
linuxsed 批量替換多個檔案中的字串
http://www.svn8.com/linux/accidence/20100422/29910.html
linux下批量替換檔案內容 1、網路上現成的資料
格式: sed -i "s/查詢欄位/替換欄位/g" `grep 查詢欄位 -rl 路徑`
Svn中文網
linux sed 批量替換多個檔案中的字串
sed -i "s/oldstring/newstring/g" `grep oldstring -rlyourdir`
例如:替換/home下所有檔案中的www.admin99.net為admin99.net Bbs.Svn8.Com
sed -i "s/www.admin99.net/admin99.net/g" `grep www.admin99.net-rl /home`
Bbs.Svn8.Comexp:sed -i "s/shabi/$/g" `grep shabi -rl ./` Svn8.Com
2、自己額外附加 Svn8.Com
2.1 將檔案1.txt內的文字“garden”替換成“mirGarden”
# sed -i "s/garden/mirGarden/g" 1.txt //sed -i 很簡單
2.2 將當前目錄下的所有檔案內的“garden”替換成“mirGarden”
## sed -i "s/garden/mirGarden/g" `ls` //其實也就是ls出多個檔名而已
Linux下如何同時替換多個檔案中的文字或字串
http://hi.baidu.com/jiqing0925/blog/item/0e97ea196662ab4242a9ad14.html
====================================
作者:吉慶( [email protected] )
主頁:http://hi.baidu.com/jiqing0925
轉載請保留作者資訊。
-------------------
做一件比較複雜的事通常存在多種方法。
一次性替換多個檔案中的文字是我們常遇到的問題,下面是解決這個問題的三種方法:
1. vi 方法
參見vim使用者手冊26.
*26.3* 改動多個檔案 假定你有個變數名為 "x_cnt" 而你要把他改為 "x_counter"。 這個變數在多個 C 檔案都被用到了。你需要在所有檔案中作此改動。你得這麼做。 把所有相關檔案放進引數列表::args *.c
這個命令會找到所有的 C 檔案並編輯其中的第一個。 現在你可以對所有這些檔案執行置換命令::argdo %s/\
命令 ":argdo" 把另一個命令當作其引數。而後者將對引數列表內所有的檔案執行。 作為引數的替換命令 "%s" 作用於所有文字行。它用 "\<x_cnt\>
/x_counter/ge | update<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獲得幫助。
注意: 如果替換的字元包括 ()[]/"'!?
等等這樣的特殊字元,你必須在字元前加上反斜槓\。
這種方法的好處是不用啟動編輯器,比較迅速。缺點是容易出現不想要的替換,例如:把px_cnt替換成了px_counter。
3. sed仍以上面的例子講解:
find . -name "*.c" -print0 | xargs -0 sed -i's/x_cnt/x_counter/g'
優缺點和perl方法相同。
以上方法的差異只在於使用工具的不同,相信肯定還有別的工具能辦到這件事。
比如emacs,肯定也能做到這些,只是因為我不用emacs,所以不熟悉。
希望大家總結自己得心應手的方法。
==================
Linuxsed批量替換多個字串
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'