前言
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