sed命令用法總結

花花蘑菇發表於2016-10-10
sed命令:
------------------------------------
sed -i “s/原字串/新字串/g” `grep 原字串 -rl 所在目錄`
例如:我要把 charset=gb2312 替換為 charset=UTF-8,
    執行命令:sed -i “s/charset=gb2312/charset=UTF-8/g” ‘grep charset=gb2312 -rl /www’ 即可。
注:-i 表示inplace edit,就地修改檔案
-r 表示搜尋子目錄
-l 表示輸出匹配的檔名
-----------------------------------------------------
sed ‘y/1234567890/ABCDEFGHIJ/’ test_sed
結果:
執行前                      執行後
test_sed的內容是      test_sed的內容是
1234567890         ABCDEFGHIJ
2345678901      BCDEFGHIJA
3456789012      CDEFGHIJAB
4567890123      DEFGHIJABC
變換關係是按兩個list的位置對應變換
-----------------------------------------------------
sed ‘s/01/Ab/g’ test_sed
結果:
執行前                      執行後
test_sed的內容是      test_sed的內容是
1234567890         1234567890
2345678901      23456789Ab
3456789012      3456789Ab2
4567890123      456789Ab23
-----------------------------------------------------
刪除:d命令
$ sed ‘2d’ example—–刪除example檔案的第二行。
$ sed ‘2,$d’ example—–刪除example檔案的第二行到末尾所有行。
$ sed ’1,2d’ fstab 就可以將fstab的前兩行刪除並顯示出來,但是它不會改變原始檔。
$ Sed ‘1,2!d’ fstab 表示刪除除第一行和第二行之外的所有行。
$ sed ‘$d’ example—–刪除example檔案的最後一行。
$ sed ‘/test/’d example—–刪除example檔案所有包含test的行。
$ sed '/^$/d' file  刪除空白行
$ sed ‘/[[:upper:]]/d’ file 表示刪除所有的大寫字母的行。
------------------------------------------------------------
全面替換標記g
$ sed 's/book/books/g' file   使用字尾 /g 標記會替換每一行中的所有匹配
$ echo sksksksksksk | sed 's/sk/SK/2g'  從第2處匹配開始替換
--------------------------------------------------------
n:以覆蓋的方式讀去下一行。
N:以追加的方式讀取下一行。
$ sed 'N;N;N;s/\n/ /g' example   把前四行併成一行
1books 2#test 3ghh 4hjhkj
5books1 6hjhj 7books2 8check
-----------------------------------------------------------------
替換: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’ example—–love被標記為1,所有loveable會被替換成lovers,而且替換的行會被列印出來。
$ sed ‘s#10#100#g’ example—–不論什麼字元,緊跟著s命令的都被認為是新的分隔符,所以,“#”在這裡是分隔符,代替了預設的“/”分隔符。表示把所有10替換成100。
---------------------------------------------------------------
選定行的範圍:逗號
$ sed -n ‘/test/,/check/p’ example—–所有在模板test和check所確定的範圍內的行都被列印。
$ sed -n ‘5,/^test/p’ example—–列印從第五行開始到第一個包含以test開始的行之間的所有行。
$ sed ‘/test/,/check/s/$/sed test/’ example—–對於模板test和west之間的行,每行的末尾用字串sed test替換。
$ sed -n '/^test$/,/hjhj/p' example2  —–所有在模板test和hjhj之間的行都被列印,^test$表示這一行只有test。
-----------------------------------------------------------------------------------
多點編輯:e命令
$ sed -e ‘1,5d’ -e ‘s/test/check/’example  —–(-e)選項允許在同一行裡執行多條命令。如例子所示,第一條命令刪除1至5行,第二條命令用check替換test。命令的執行順序對結果有影響。如果兩個命令都是替換命令,那麼第一個替換命令將影響第二個替換命令的結果。
$ sed -–expression=’s/test/check/’ –expression=’/love/d’ example  —–--一個比-e更好的命令是–expression。它能給sed表示式賦值。
-------------------------------------------------------
從檔案讀入:r命令
$ sed ‘/test/r file’ example —–file裡的內容被讀進來,顯示在與test匹配的行後面,如果匹配多行,則file的內容將顯示在所有匹配行的下面。
--------------------------------------------------------
寫入檔案:w命令
$ sed -n ‘/test/w file’ example —–在example中所有包含test的行都被寫入file裡。
------------------------------------------------
追加命令:a命令
$ sed ‘/^test/a\\—>this is a example’ example —–‘this is a example’被追加到以test開頭的行後面,sed要求命令a後面有一個反斜槓。
$ sed ‘/^test/a\—>this is a example’ example
$ sed '/#/a\This is a comment line.\nIt can be ignore.' example \n這裡表示換行,也就是說一次可以新增兩行,分別是This is a comment line.和It can be ignore.
-----------------------------------------------------------
插入:i命令
$ sed ‘/test/i\new line————————-‘ example —–如果test被匹配,則把反斜槓後面的文字插入到匹配行的前面。
$ sed '/#/!i\This is a comment line.\nIt can be ignore.' example ---如果在i前面加!表示對除了匹配到的行的其他行的前面新增以上兩行。
--------------------------------------------------------
下一個:n命令
$ sed ‘/test/{n;s/aa/bb/;}’ example—–如果test被匹配,則移動到匹配行的下一行,替換這一行的aa,變為bb,並列印該行,然後繼續。
------------------------------------------------
變形:y命令
$ sed ‘1,10y/abcde/ABCDE/’ example—–把1–10行內所有abcde轉變為大寫,注意,正規表示式元字元不能使用這個命令。
-------------------------------------------------
退出:q命令
$ sed ’10q’ example—–列印完第10行後,退出sed。
-----------------------------------------------------
保持和獲取:h命令和G命令
$ sed -e ‘/test/h’ -e ‘$G‘ example
在sed處理檔案的時候,每一行都被儲存在一個叫模式空間的臨時緩衝區中,除非行被刪除或者輸出被取消,否則所有被處理的行都將列印在螢幕上。接著模式空間被清空,並存入新的一行等待處理。
在這個例子裡,匹配test的行被找到後,將存入模式空間,h命令將其複製並存入一個稱為保持快取區的特殊緩衝區內。第二條語句的意思是,當到達最後一行後,G命令取出保持緩衝區的行,然後把它放回模式空間中,
且追加到現在已經存在於模式空間中的行的末尾。在這個例子中就是追加到最後一行。簡單來說,任何包含test的行都被複制並追加到該檔案的末尾。
--------------------------------------------------------
保持和互換:h命令和x命令
$ sed -e ‘/test/h’ -e ‘/check/x’ example —–互換模式空間和保持緩衝區的內容。也就是把包含test與check的行互換。
-------------------------------------------------------------------------
列印奇數行和偶數行
sed -n 'p;n' test.txt  #奇數行  
sed -n 'n;p' test.txt  #偶數行
-n表示取消預設輸出
sed讀取第一行,執行n命令,此時模式空間為第二行的內容,執行p,列印模式空間內容,之後讀取第三行,執行n命令,此時模式空間為第四行的內容,執行p,列印模式空間內容,如此迴圈直到退出。
因此,最終列印出來的就是偶數行。
sed -n '1~2p' test.txt  #奇數行,1+2*N表示奇數
sed -n '2~2p' test.txt  #偶數行,0+2*N表示偶數
seq 10 | sed '0~3a\=='  #每隔三行就在結尾新增==

sed元字符集:
^ 匹配行開始,如:/^sed/匹配所有以sed開頭的行。
$ 匹配行結束,如:/sed$/匹配所有以sed結尾的行。
. 匹配一個非換行符的任意字元,如:/s.d/匹配s後接一個任意字元,最後是d。
* 匹配0個或多個字元,如:/*sed/匹配所有模板是一個或多個空格後緊跟sed的行。
[] 匹配一個指定範圍內的字元,如/[ss]ed/匹配sed和Sed。  
[^] 匹配一個不在指定範圍內的字元,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行。
\(..\) 匹配子串,儲存匹配的字元,如s/\(love\)able/\1rs,loveable被替換成lovers。
& 儲存搜尋字元用來替換其他字元,如s/love/**&**/,love這成**love**。
\< 匹配單詞的開始,如:/\ 匹配單詞的結束,如/love\>/匹配包含以love結尾的單詞的行。
x\{m\} 重複字元x,m次,如:/0\{5\}/匹配包含5個0的行。
x\{m,\} 重複字元x,至少m次,如:/0\{5,\}/匹配至少有5個0的行。
x\{m,n\} 重複字元x,至少m次,不多於n次,如:/0\{5,10\}/匹配5~10個0的行。
------------------------------------------------------------------------
*代表{0,} +代表{1,} ?代表{0,1}
([0-9]+) 表示匹配0~9中的任意數字,並且至少1位。如果是*號,則表示匹配0~9中的任意數字,並且可以是0位(不存在)。
如果至少需要2位數,最多8位數,怎麼寫呢? ([0-9]{2,7}) 即可
-------------------------------------------------
正規表示式 \w\+ 匹配每一個單詞,使用 [&] 替換它,& 對應於之前所匹配到的單詞: 
echo this is a test line | sed 's/\w\+/[&]/g'   
[this] [is] [a] [test] [line]
--------------------------------------------------------
匹配給定樣式的其中一部分\1,\2等等: 
echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'
this is 7 in a number
echo aaa BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'
BBB aaa   這裡\1是aaa,\2是BBB 
echo  bADca BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/;\2:\1?/' 
bAD;BBB:ca?  這裡\1是ca,\2是BBB

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28497416/viewspace-2126030/,如需轉載,請註明出處,否則將追究法律責任。