Shell編程之sed命令詳細介紹,shellsed詳細介紹
sed介紹
sed編輯器是被稱為流編輯器。它被用來在輸入資料流(檔案或者從管道輸入)上進行基本的文本轉換。處理時,把當前處理的行儲存在臨時緩衝區,稱為“模式空間”(pattern space),接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往螢幕,接著處理下一行,不斷重複,直到檔案末尾。檔案內容並沒有改變,除非使用重新導向儲存輸出,sed主要用啦愛自動編輯一個或多個檔案,簡化對檔案的反覆操作,編寫轉換程式等。
sed命令列選項
sed命令完整格式: sed OPTIONS ... [SCRIPT] [INPUTFILE...] 命令列選項有以下: --version:顯示版本資訊; -n --quiet --silent:只列印指令碼處理後的結果; -e --expression=script:以選項中指定的script處理輸入的檔案; -f script-file或--file=script-file:以選項中指定的檔案處理輸入的檔案; -i [SUFFIX]或--in-place[=SUFFIX]:直接修改文檔讀取的內容,不會輸出到螢幕; -r或--regexp-extended:sed使用擴充正則。
sed退出狀態
退出狀態為0表示成功,非零值表示失敗。 0:成功完成; 1:無效的命令,無效的文法或者無效的Regex; 2:命令列中指定的檔案不能被開啟(比如檔案找不到或者沒有許可權),繼續處理其他檔案; 4:I/O錯誤或者運行時嚴重的處理錯誤;
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的行。
sed命令
可通過man sed查看該命令的詳細參數資訊:
[root@strong sed_stu]# man sed
sed命令示範
測試資料
[root@strong sed_stu]# cat emp.txt 0001 Alen M 240002 Tiboo M 320003 Felix M 260004 Jack F 240005 Tim M 250006 Audi F 300007 Bobo F 320008 Geo M 210009 Andy F 1900010 Peter M 28[root@strong sed_stu]#
1、列印:p命令
--列印第一行資訊[root@strong sed_stu]# sed '1p' emp.txt 0001 Alen M 240001 Alen M 240002 Tiboo M 320003 Felix M 260004 Jack F 240005 Tim M 250006 Audi F 300007 Bobo F 320008 Geo M 210009 Andy F 1900010 Peter M 28預設情況下,會把輸入行列印到螢幕上,選項-n取消預設列印,-n和p一起使用時只列印選定的內容:--列印第一行[root@strong sed_stu]# sed -n '1p' emp.txt 0001 Alen M 24--列印第三行到第五行的記錄[root@strong sed_stu]# sed -n '3,5p' emp.txt 0003 Felix M 260004 Jack F 240005 Tim M 25--列印包含Tim的行[root@strong sed_stu]# sed -n '/Tim/p' emp.txt 0005 Tim M 25--列印Tim開始到Bobo之間的行[root@strong sed_stu]# sed -n '/Tim/,/Bobo/p' emp.txt 0005 Tim M 250006 Audi F 300007 Bobo F 32
2、刪除:d命令
--刪除第五行,預設情況下,其餘行會被列印到螢幕上[root@strong sed_stu]# sed '5d' emp.txt 0001 Alen M 240002 Tiboo M 320003 Felix M 260004 Jack F 240006 Audi F 300007 Bobo F 320008 Geo M 210009 Andy F 1900010 Peter M 28--刪除第三行到最後一行的記錄[root@strong sed_stu]# sed '3,$d' emp.txt 0001 Alen M 240002 Tiboo M 32--刪除包含模式Felix到Geo的行[root@strong sed_stu]# sed '/Felix/,/Geo/d' emp.txt 0001 Alen M 240002 Tiboo M 320009 Andy F 1900010 Peter M 28
3、替換:s命令
--將文本裡的2替換為222[root@strong sed_stu]# sed 's/2/222/' emp.txt 0001 Alen M 2224000222 Tiboo M 320003 Felix M 22260004 Jack F 22240005 Tim M 22250006 Audi F 300007 Bobo F 32220008 Geo M 22210009 Andy F 1900010 Peter M 2228--替換標識為數字2,表示替換第二次出現的[root@strong sed_stu]# sed 's/2/....222/2' emp.txt 0001 Alen M 240002 Tiboo M 3....2220003 Felix M 260004 Jack F 240005 Tim M 250006 Audi F 300007 Bobo F 320008 Geo M 210009 Andy F 1900010 Peter M 28註:本例替換的是行中出現的第一次2的值為222,如果替換正行的記錄,則需要和g一起使用,表示全域替換。--替換標識為g,表示用新文本替換現有文本的全部執行個體[root@strong sed_stu]# sed 's/2/222/g' emp.txt 0001 Alen M 2224000222 Tiboo M 32220003 Felix M 22260004 Jack F 22240005 Tim M 22250006 Audi F 300007 Bobo F 32220008 Geo M 22210009 Andy F 1900010 Peter M 2228---替換標識p,表示列印原始行的內容[root@strong sed_stu]# sed -n 's/2/222/gp' emp.txt 0001 Alen M 2224000222 Tiboo M 32220003 Felix M 22260004 Jack F 22240005 Tim M 22250007 Bobo F 32220008 Geo M 222100010 Peter M 2228--替換標識為w file,表示將替換的結果寫入檔案[root@strong sed_stu]# sed 's/2/....222/w test.txt' emp.txt 0001 Alen M ....2224000....222 Tiboo M 320003 Felix M ....22260004 Jack F ....22240005 Tim M ....22250006 Audi F 300007 Bobo F 3....2220008 Geo M ....22210009 Andy F 1900010 Peter M ....2228[root@strong sed_stu]# cat test.txt 0001 Alen M ....2224000....222 Tiboo M 320003 Felix M ....22260004 Jack F ....22240005 Tim M ....22250007 Bobo F 3....2220008 Geo M ....222100010 Peter M ....2228--在Felix和Audi之間的末尾加上***HI****[root@strong sed_stu]# sed '/Felix/,/Audi/s/$/***HI****/' emp.txt 0001 Alen M 240002 Tiboo M 320003 Felix M 26***HI****0004 Jack F 24***HI****0005 Tim M 25***HI****0006 Audi F 30***HI****0007 Bobo F 320008 Geo M 210009 Andy F 1900010 Peter M 28
4、使用多個編輯器命令:e命令
[root@strong sed_stu]# sed -e 's/Alen/ALEN/;/Jack/,/Audi/s/$/****HI****/' emp.txt 0001 ALEN M 240002 Tiboo M 320003 Felix M 260004 Jack F 24****HI****0005 Tim M 25****HI****0006 Audi F 30****HI****0007 Bobo F 320008 Geo M 210009 Andy F 1900010 Peter M 28--或者分開使用-e[root@strong sed_stu]# sed -e 's/Alen/ALEN/' -e '/Jack/,/Audi/s/$/****HI****/' emp.txt 0001 ALEN M 240002 Tiboo M 320003 Felix M 260004 Jack F 24****HI****0005 Tim M 25****HI****0006 Audi F 30****HI****0007 Bobo F 320008 Geo M 210009 Andy F 1900010 Peter M 28--使用次提示符[root@strong sed_stu]# sed -e '> s/Alen/ALEN/> /Jack/,/Audi/s/$/****HI***/' emp.txt0001 ALEN M 240002 Tiboo M 320003 Felix M 260004 Jack F 24****HI***0005 Tim M 25****HI***0006 Audi F 30****HI***0007 Bobo F 320008 Geo M 210009 Andy F 1900010 Peter M 28
5、從檔案讀取編輯器命令
--sed命令[root@strong sed_stu]# cat script.txt s/Alen/ALEN//Jack/,/Audi/s/$/****HI****/---f指定sed指令檔[root@strong sed_stu]# sed -f script.txt emp.txt 0001 ALEN M 240002 Tiboo M 320003 Felix M 260004 Jack F 24****HI****0005 Tim M 25****HI****0006 Audi F 30****HI****0007 Bobo F 320008 Geo M 210009 Andy F 1900010 Peter M 28
6、附加文本:a命令
--在指定行之後添加一行[root@strong sed_stu]# sed '3a\This is append test' emp.txt 0001 Alen M 240002 Tiboo M 320003 Felix M 26This is append test0004 Jack F 240005 Tim M 250006 Audi F 300007 Bobo F 320008 Geo M 210009 Andy F 1900010 Peter M 28
7、插入文本:i命令
[root@strong sed_stu]# sed '3i\This is inserted line' emp.txt 0001 Alen M 240002 Tiboo M 32This is inserted line0003 Felix M 260004 Jack F 240005 Tim M 250006 Audi F 300007 Bobo F 320008 Geo M 210009 Andy F 1900010 Peter M 28
8、更改行:c命令
--修改整行常值內容[root@strong sed_stu]# sed '3c\This is updated by new line' emp.txt 0001 Alen M 240002 Tiboo M 32This is updated by new line0004 Jack F 240005 Tim M 250006 Audi F 300007 Bobo F 320008 Geo M 210009 Andy F 1900010 Peter M 28
9、刪除行:d命令
[root@strong sed_stu]# sed '1,5d' emp.txt 0006 Audi F 300007 Bobo F 320008 Geo M 210009 Andy F 1900010 Peter M 28
10、變換行:y命令
[root@strong sed_stu]# sed '1,5y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' emp.txt 0001 ALEN M 240002 TIBOO M 320003 FELIX M 260004 JACK F 240005 TIM M 250006 Audi F 300007 Bobo F 320008 Geo M 210009 Andy F 1900010 Peter M 28
11、擷取下一行:n命令
--擷取Jack的下一行,並用....2222替換2[root@strong sed_stu]# sed '/Jack/{n;s/2/....2222/;} ' emp.txt0001 Alen M 240002 Tiboo M 320003 Felix M 260004 Jack F 240005 Tim M ....222250006 Audi F 300007 Bobo F 320008 Geo M 210009 Andy F 1900010 Peter M 28--刪除空行[root@strong sed_stu]# cat emp.txt 0001 Alen M 240002 Tiboo M 320003 Felix M 260004 Jack F 240005 Tim M 250006 Audi F 300007 Bobo F 320008 Geo M 210009 Andy F 1900010 Peter M 28--刪除Felix下一行的空格[root@strong sed_stu]# sed '/Felix/{n;d}' emp.txt 0001 Alen M 240002 Tiboo M 320003 Felix M 260004 Jack F 240005 Tim M 250006 Audi F 300007 Bobo F 320008 Geo M 210009 Andy F 1900010 Peter M 28--刪除所有空格[root@strong sed_stu]# sed '/^$/d' emp.txt 0001 Alen M 240002 Tiboo M 320003 Felix M 260004 Jack F 240005 Tim M 250006 Audi F 300007 Bobo F 320008 Geo M 210009 Andy F 1900010 Peter M 28
12、組合多行文本:N命令
--在資料流中添加下一行以建立用於處理的多行組[root@strong sed_stu]# sed '/Alen/{N;s/\n/ /;}' emp.txt 0001 Alen M 24 0002 Tiboo M 320003 Felix M 260004 Jack F 240005 Tim M 250006 Audi F 300007 Bobo F 320008 Geo M 210009 Andy F 1900010 Peter M 28
13、否定命令:!命令
--輸出不在3行和7行之間的資料行[root@strong sed_stu]# sed -n '3,7!p' emp.txt 0001 Alen M 240002 Tiboo M 320008 Geo M 210009 Andy F 1900010 Peter M 28
14、模式替換
--&表示替換命令中的匹配模式--給某個單詞加引號[root@strong sed_stu]# echo "The cat sleeps in his hat" | sed 's/.at/"&"/g'The "cat" sleeps in his "hat"--使用圓括弧定義替換模式中的子字串元素,然後用特定符號引用,替換字元由反斜線和數字組成[root@strong sed_stu]# echo "This is Alen Liu , not Alen Li" | sed 's/\(Alen\) Liu/\1 L/' This is Alen L , not Alen Li