Shell編程之sed命令詳細介紹,shellsed詳細介紹

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.