电竞比分网-中国电竞赛事及体育赛事平台

分享

【Shell編程】史上最全sed命令使用詳解

 拾泉老人 2025-04-16 發(fā)布于福建
sed編輯器介紹
sed(Stream Editor)是Linux下一款功能強大的非交互流式文本編輯器,可以對文本文件進行增、刪、改、查等操作,支持按行、按字段、按正則匹配文本內容,靈活方便,特別適合于大文件的編輯。sed是一種流編輯器,它是文本處理中非常實用的工具,能夠完美的配合正則表達式使用,功能不同凡響。
流編輯器會在編輯器處理數(shù)據(jù)之前基于預先提供的一組規(guī)則來編輯數(shù)據(jù)流。處理文本時,sed把當前處理的行存儲在臨時緩沖區(qū)中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區(qū)中的內容,處理完成后,把緩沖區(qū)的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。sed主要用來自動編輯一個或多個文件、簡化對文件的反復操作、編寫轉換程序等。
sed編輯器工作流程
sed編輯器可以根據(jù)命令來處理數(shù)據(jù)流中的數(shù)據(jù),這些命令要么從命令行中輸入,要么存儲在一個命令文本文件中。
在可視化編輯器中,通常無需多想就可以在文本文件中找到需要更改的內容。我們的眼睛(或屏幕閱讀器)掃描文本,找到要更改的單詞或要插入或刪除文本的位置,然后開始輸入。不過,sed 沒有交互模式,因此我們必須告訴它必須滿足哪些條件才能運行特定命令。
sed編輯器的工作流程主要包括讀取、執(zhí)行和顯示三個過程:
   ?讀?。簊ed從輸入流 (文件、管道、標準輸入) 中讀取一行內容并存儲到臨時的緩沖區(qū)中(又稱模式空間,pattern space);
   ?執(zhí)行:默認情況下,所有的sed命令都在模式空間中順序地執(zhí)行,除非指定了行的地址,否則sed命令將會在所有的行上依次執(zhí)行;
   ?顯示:發(fā)送修改后的內容到輸出流。在發(fā)送數(shù)據(jù)后,模式空間將會被清空。在所有的文件內容都被處理完成之前,上述過程將重復執(zhí)行,直至所有內容被處理完。
注意:默認情況下所有的sed命令都是在模式空間內執(zhí)行的,因此輸入的文件并不會發(fā)生任何變化,除非是用重定向存儲輸出。
sed命令的基本語法
sed [options] 'command' file(s)sed [options] scriptfile file(s)#舉例如下:sed -e '格式' 文件1 文件2 ...sed -n -e '操作’ 文件1 文件2 ...sed -f 腳本文件 文件1 文件2 ...sed -i -e '操作' 文件1 文件2 ...sed -e 'n {操作1 操作2...}' 文件1 文件2 ...
其中:

   options:可以是 -e(表達式),-f(腳本文件)等。

  command/scriptfile:包含一個或多個 sed 命令,也可以是腳本文件。

   file(s):要處理的文本文件。

常用的sed命令選項
-e或--expression=: 表示用指定命令來處理輸入的文本文件,只有一個操作命令時可省略,一般在執(zhí)行多個操作命令使用;-f或--file=: 表示用指定的腳本文件來處理輸入的文本文件;-i[SUFFIX]: 直接修改目標文本文件,如果設置了SUFFIX后綴名,sed會將數(shù)據(jù)備份;-n、--quiet或silent: 禁止自動打印模式空間內容,僅顯示script處理后的結果;-r:啟用擴展的正則表達式語法(在某些版本中使用-E選項);
常用的sed編輯指令
s:替換模式匹配的文本;i\文本:在匹配的數(shù)據(jù)行前插入文本;a\文本:在匹配的數(shù)據(jù)行后追加文本;c\文本:用新文本替換匹配數(shù)據(jù)行的整行內容;r 文件:將文件的內容插入到當前行之后;w 文件:將當前匹配到的數(shù)據(jù)寫入指定的文件中;l:小寫L,打印當前匹配的數(shù)據(jù)行(顯示控制字符,如回車符等);=:打印當前讀取的數(shù)據(jù)所在的行數(shù);q:[exit code] 立刻退出sed腳本;d:刪除當前模式空間內容,并讀取新內容;D:刪除當前模式空間開頭至\n的內容;h:將當前模式空間中內容覆蓋至保持空間;H:將當前模式空間中內容追加至保持空間;g:將當前保持空間中內容覆蓋至模式空間;G:將當前保持空間中內容追加至模式空間;n:提前讀取下一行,覆蓋模型空間前一行;N:追加下一行到模式空間,同時將兩行看做一行,但是兩行之間依然含有\(zhòng)n換行符;p:打印當前模式空間內容,追加到默認輸出之后;P:打印當前模式空間開始至\n的內容,并追加到默認輸出之前;x:將當前保持空間和模式空間內容互換;y:字符轉換,轉換前后的字符長度必須相同;&:表示已匹配字符串標記;
常用的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開頭的單詞的行。\> 匹配單詞的結束,如/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的行。

常用示例

以下示例,假設文件123.txt包含如下內容:

$ cat 123.txtonetwothreefourfivesixseveneightnineten

指定行號并打印它。因為sed處理后的默認操作也是將一行打印到stdout,所以會產生復制一行的效果:

$ sed '1p' 123.txtoneonetwothreefourfivesixseveneightnineten

p: 打印(通常與“-n”選項一起使用),如果同時指定行,表示打印指定行;如果不指定行,則表示打印所有內容;如果有非打印字符,則以ASCII碼輸出:

$ sed 'p' 123.txtoneonetwotwothreethreefourfourfivefivesixsixsevenseveneighteightnineninetenten$ sed -n 'p' 123.txtonetwothreefourfivesixseveneightnineten

也可以按步長指定行號并打印。例如,1~2表示每兩行選擇一次(從第一行開始每兩行選擇一次),1~3表示每三行選擇一次:

$ sed '1~2p' 123.txtoneonetwothreethreefourfivefivesixsevenseveneightninenineten$ sed '1~3p' 123.txtoneonetwothreefourfourfivesixsevenseveneightninetenten

使用$來操作文件的最后一行:

$ sed '$p' 123.txtonetwothreefourfivesixseveneightninetenten

也可以選擇多行(例如,sed '1,$p' 打印第一行到最后一行)。

任何按數(shù)字或位置選擇的內容,都可以用感嘆號 (!) 字符反轉。如下示例將選擇除第最后一行之外的所有行:

$ sed '$!p' 123.txtoneonetwotwothreethreefourfourfivefivesixsixsevenseveneighteightninenineten

=:打印行號(使用sed '='或sed -n '=;p'):

$ sed '=' 123.txt1one2two3three4four5five6six7seven8eight9nine10ten

上面的輸出行號跟內容不在同一行,將輸出通過管道傳給另一個sed命令處理就完美了:

$ sed '=' 123.txt | sed 'N;s/\n/: /'1: one2: two3: three4: four5: five6: six7: seven8: eight9: nine10: ten
# 備注:# =-代表行號# N-追加下一行至當前處理行的后面,組成一個新行來處理# s/\n/: /-替換,這里是將換行符/n替換為:
l (小寫L):打印數(shù)據(jù)流中的文本和不可打印的ASCII字符(比如結束符$、制表符\t)
$ sed -n 'l' 123.txtone$two$three$four$five$six$seven$eight$nine$ten$
有關指定行打印的相關示例:
sed -n '1,3p' 123.txt      #打印一到三行sed -n '3,$p' 123.txt      #打印三到最后一行sed -n '$=;$p' 123.txt     #打印最后一行顯示行號sed -n '1,  3p' 123.txt    #打印1之后的連續(xù)3行,即1-4sed '3q' 123.txt           #打印前3行信息后退出,q表示退出sed -n 'p;n' 123.txt       #打印奇數(shù)行; n表示移動到下一行sed -n 'n;p' 123.txt       #打印偶數(shù)行sed -n '2,${n;p}' 123.txt  #從第二行開始,n移動下一行,p打印,表示打印奇數(shù)行sed -n '2,${p;n}' 123.txt  #從第二行開始,n移動下一行,p打印,表示打印偶數(shù)行
有關匹配打印的相關示例:
$ sed -n ' /th/p' 123.txt #//搜索包含th的行進行打印,區(qū)分大小寫three$ sed -n ' /^f/p' 123.txt #搜索以f開頭的行進行打印fourfive$ sed -n '/ne$/p' 123.txt #打印以ne結尾的行onenine$ sed -n '/tw\|th/p' 123.txt#搜索包含tw或者th的行進行打印twothree$ sed -n '2,/th/p' 123.txt #從第二行開始打印到第一個包含th的行
$ sed -nr '/re{1,}e/p' 123.txt #-r表示支持正則表達式three
有關刪除行的相關示例:
sed 'd' 123.txt          #不指定行號,全部刪除sed '3d' 123.txt         #刪除第3sed '2,4d' 123.txt       #刪除2-4sed '$d' 123.txt         #刪除最后一行sed '/^$/d' 123.txt      #刪除空行sed '/th$/d' 123.txt      #刪除包含th字符的行sed '/th$/!d' 123.txt     #不刪除包含nologin的行sed '/se/,/te/d' 123.txt #遇到twelve開啟刪除,遇到fifteen關閉刪除

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多