文本處理工具之sed 1、sed是一種行編輯器,對文本逐行處理。處理時,它會將文本行載入"模式空間"(臨時緩沖區),接著用sed命令對模式空間的內容進行處理,處理完成后,將模式空間內容輸出到顯示屏 與之類似的處理工具還有grep和awk,相比grep,sed不僅對文本有過濾功能,還可以對文本進行其他增刪改的操作。而相比awk,sed顯得更加簡單高效。下面我們就來細說"sed"。 2、用法:sed [options] '地址 指令’ file...... options:一些功能選項 地址:匹配范圍,可以是單行、多行,或者是匹配模式的行,模式支持正則表達式。 指令:是sed自帶的文本處理命令,如打印、刪除、更改等。以下做詳細解釋 options -n 不打印模式空間 -e 多點編輯,同時處理多條指令 -f 讀取腳本文件 -r 使其支持擴展正則表達式 -i 直接修改原文件 地址 1 首行 n 指定行 $ 尾行 n1,n2 從n1到n2之間所有的行 n1,+10 從n1開始算起,之后的10行 /patter/ 匹配該模式的行,支持正則 /pat1/,/pat2/ 兩個匹配行之間的行,第一次匹配pat1,和第一次匹配part2之間的行。如果只匹配pat1,sed會打印pat1到行尾的所有行 n1~n2 ~代表步進,以n1為基準,n2為跳數匹配。如:1~2,就是打印奇數行 指令 p 打印模式空間處理行和過濾行,常與-n一起使用,只打印過濾行 d 刪除過濾行 = 打印行號 q 退出腳本 r 讀取文件,通常與aic一起使用 w 將匹配內容輸出到文件 a\text 在匹配行后追加文本 i\text 在匹配行前面追加文本 c\text 替換匹配行內容 ! 通常在 '地址' 后面,表示取反 & 引用前面的字符串 s///(g|p|w) 查找替換 示例: 打印匹配行 #sed -n '1p' /etc/passwd ##打印首行 #sed -n '$p' /etc/passwd ##打印尾行 #sed -n '1,3p' /etc/passwd ##打印前三行 #sed -n '1,3!p' /etc/passwd ##打印除前三行之外的行 #sed -n '/root/,3p' /etc/passwd ##打印匹配root到第三行之間的行 #sed -n '/postfix/,$p' /etc/passwd ##打印匹配行到尾行之間的行 #sed -n -e '1p' -e '$p' /etc/passwd ##使用-e命令同時處理多條指令 #sed '/root/a\########' /etc/passwd ##行后追加 #sed '/root/i\########' /etc/passwd ##行前追加 #sed '/root/c\########' /etc/passwd ##替換匹配行 刪除匹配行 #sed '1d' /etc/passwd ##刪除首行 #sed '1~2d' /etc/passwd ##刪除奇數行 #sed '10,$d' /etc/passwd ##刪除10行以后的行 文本替換 #sed -n 's/root/ROOT/p' /etc/passwd ##將每行首次出現的root替換為ROOT,并打印過濾行 #sed -n 's/root/ROOT/2p' /etc/passwd ##將文本行中第二次出現的root替換為ROOT,打印該行 #sed -n 's/root/ROOT/gp' /etc/passwd ##將全文出現的root全部替換成大寫,并打印過濾行 #sed -n 's/bin/&2/gp' /etc/passwd ##全文搜索,將bin替換成bin2,打印這些行 實用的應用場景 #sed '/^#/d;/^$/d' /etc/fstab ##去掉/etc/fstab中空行和以#開頭的行 #sed -r 's@([^:]+):(.*):([^:]+)@\3:\2:\1@' /etc/passwd ##將/etc/passwd文件中用戶名和默認shell替換位置 --------上述示例,很好的利用了正則的分組匹配 --------([^:]+)表示匹配(非:字符一次以上) #sed '10,$s/^/#/' /etc/passwd ##為10行及其之后的行添加#注釋符 3、sed高級功能 sed除了以上基本的文本處理能力外,還具備一些高級用法。 保持空間:和模式空間一樣,也是在sed命令執行的時候,內存給其分配的一塊緩沖空間。相比模式空間,保持空間只是一塊臨時存儲空間,其內容不會直接被sed命令處理輸出到屏幕 高級編輯命令 h 將模式空間內容覆蓋至保持空間 H 將模式空間內容追加至保持空間 g 將保持空間內容覆蓋模式空間 G 將保持空間內容追加至模式空間 x 將保持空間內容和模式空間互換 n 讀取匹配行的下一行覆蓋至模式空間 N 讀取匹配行的下一行追加至模式空間
如圖: h:執行h命令,保持空間內容將變為a。 H:執行H命令,保持空間內容將變為a\nb\nc\n g:執行g命令,模式空間將變為b\nc G:執行G命令,模式空間內容變為a\nb\nc x:執行x命令,模式空間內容變為b\nc,保持空間內容變為a 二者互換 n:執行n命令,模式空間內容直接變為d,a直接覆蓋,不做任何處理 N:執行N命令,模式空間內容將變為a\nd 示例 (如上圖,txt為a b c d e f 六行內容) #sed -n 'n;p' txt 該命令打印txt偶數行 b d f #sed '1!G;h;$!d' txt ##1!G:表示只要不是第一行,都執行G命令。$!d:表示只要不是最后一行,都執行d命令 f e d c b a #sed '$!N;$!D' txt ##$!N:表示只要不是最后一行就執行N命令;$!D:表示只要不是最后一行就執行D命令 e f #sed -n '1!G;h;$p' txt ##1!G:表示只要不是第一行就執行G命令,$p:表示最后一行執行p命令 f e d c b a 綜上:sed命令操作簡潔、高效,是linux下必學文本處理工具之一,靈活掌握sed用法,對編寫腳本起到很大的幫助
原創文章,作者:Abigheart,如若轉載,請注明出處:http://www.www58058.com/71288
通俗易懂,邏輯清晰,循環漸進,實乃經典中的經典?。?/p>