Linux操作系統之sed命令詳解


前言

1、Linux操作系統下的  sed  命令是利用腳本來處理文本文件。

2、sed 命令可依照腳本的指令來處理、編輯文本文件。

3、sed 命令主要用來自動編輯一個或多個文件、簡化對文件的反復操作、編寫轉換程序等。

4、sed 是一種流編輯器,它是文本處理中非常好的工具,能夠完美的配合正則表達式使用,功能不同凡響。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接着用 sed 命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接着處理下一行,這樣不斷重復,直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出。

5、 sed 命令主要用來自動編輯一個或多個文件,可以將數據行進行替換、刪除、新增、選取等特定工作,簡化對文件的反復操作,編寫轉換程序等。

命令語法

sed [-hnV][-e<script>][-f<script文件>][文本文件]

更直觀的看:

sed的命令格式:sed [options] 'command' file(s)

sed的腳本格式:sed [options] -f scriptfile file(s)

參數說明:

1、 -e<script> 或 --expression=<script> :以選項中指定的script腳本行來處理輸入的文本文件。

2、 -f<script文件> 或 --file=<script文件> :以選項中指定的script腳本文件來處理輸入的文本文件。

3、 -h 或  --help :顯示幫助。

4、 -n 或 --quiet 或 --silent :僅顯示script腳本處理后的結果。

5、 -V 或--version:顯示命令版本信息。

 -e :直接在命令行模式上進行sed動作編輯,此為默認選項;

 -f :將sed的動作寫在一個文件內,用–f filename 執行filename內的sed動作;

 -i :直接修改文件內容;

 -n :只打印模式匹配的行;

 -r :支持擴展表達式;

 -h或--help:顯示幫助;

 -V或--version:顯示版本信息。

動作說明:

a :新增, a 的后面可以接字符串,而這些字串會在新的一行出現(目前行的下一行)。

c :取代, c 的后面可以接字符串,這些字串可以取代 n1,n2 之間的行。

d :刪除,所以 d 后面通常不接任何東西;

i :插入, i 的后面可以接字符串,而這些字串會在新的一行出現(目前的上一行)。

p :打印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 命令一起運行。

s :取代,可以直接進行取代的工作,通常 s 的動作可以搭配正則表達式。

sed常用命令

 a\ 在當前行下面插入文本;

 i\ 在當前行上面插入文本;

 c\ 把選定的行改為新的文本;

 d 刪除,刪除選擇的行;

 D 刪除模板塊的第一行;

 s 替換指定字符;

 h 拷貝模板塊的內容到內存中的緩沖區;

 H 追加模板塊的內容到內存中的緩沖區;

 g 獲得內存緩沖區的內容,並替代當前模板塊中的文本;

 G 獲得內存緩沖區的內容,並追加到當前模板塊文本的后面;

 l 列表不能打印字符的清單;

 n 讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令;

 N 追加下一個輸入行到模板塊后面並在二者間嵌入一個新行,改變當前行號碼;

 p 打印模板塊的行。 P(大寫) 打印模板塊的第一行;

 q 退出Sed;

 b lable 分支到腳本中帶有標記的地方,如果分支不存在則分支到腳本的末尾;

 r file 從file中讀行;

 t label if分支,從最后一行開始,條件一旦滿足或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾;

 T label 錯誤分支,從最后一行開始,一旦發生錯誤或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾;

 w file 寫並追加模板塊到file末尾;

 W file 寫並追加模板塊的第一行到file末尾;

 ! 表示后面的命令對所有沒有被選定的行發生作用;

 = 打印當前行號;

 # 把注釋擴展到下一個換行符以前;

sed替換標記

 g 表示行內全面替換;

 p 表示打印行;

 w 表示把行寫入一個文件;

 x 表示互換模板塊中的文本和緩沖區中的文本;

 y 表示把一個字符翻譯為另外的字符(但是不用於正則表達式);
 
 \1 子串匹配標記;

 & 已匹配字符串標記;

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的行;

實例 1:文件中新增字符串內容

1、創建一個 testfile 文件,如下:

2、 在 testfile 文件的第四行后添加一行,並將結果輸出到標准輸出,在命令行提示符下輸入如下命令:

sed -e 4a\newLine testfile 

如下:

實例 2:文件中以行為單位的新增/刪除

1、將 testfile 的內容列出並且列印行號

nl testfile

如下:

2、將 testfile 的內容列出並且列印行號,同時將第 2~5 行刪除

nl testfile | sed '2,5d'

如下:

詳細解釋:

sed 的動作為 2,5d ,動作 d 是刪除的意思,因為刪除了 2-5 行,所以終端控制台顯示的數據就沒有 2-5 行, 另外,原本應該是要下達 sed -e 才對,但沒有 -e 也是可以的,同時也要注意的是, sed 后面接的動作,請務必以  '...' 兩個單引號括住。

注意:sed命令的執行結果只體現在打印到控制台上的結果改變,硬盤中的實際文件內容並未改變。例如:(在上述對文件的sed操作后,查看testfile文件內容並未改變) 

3、將 testfile 的內容列出並且列印行號,同時將第2行刪除:

4、將 testfile 的內容列出並且列印行號,同時刪除第3行到最后一行:

5、將 testfile 的內容列出並且列印行號,在第二行后(即加在第三行) 加上drink tea字樣&&在第四行后(即加在第五行) 加上newLine字樣:

 

6、將 testfile 的內容列出並且列印行號,同時在第二行前加上drink tea字樣:

7、將 testfile 的內容列出並且列印行號,同時在第二行后面加上兩行字,例如 Drink tea or .....  drink beer?

注意:每一行之間都必須要以反斜杠 \ 來進行新行標記。(上面的例子中在第一行的最后面就有 \ 存在)

實例 3:以行為單位的替換與顯示

參考博客:https://www.runoob.com/linux/linux-comm-sed.html

參考博客:https://www.linuxprobe.com/linux-sed-command.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM