文本處理工具之sed

                          文本處理工具之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       讀取匹配行的下一行追加至模式空間 
文本處理工具之sed 如圖:
    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

(0)
AbigheartAbigheart
上一篇 2017-03-17 20:11
下一篇 2017-03-18 10:32

相關推薦

  • N22第三周作業

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可 [root@localhost ~]# who |cut -d' ' -f1 |sort -u   root   xuc 2、取出…

    Linux干貨 2016-08-29
  • LVM

       本節主要為raid和LVM相關 一、作業 1、創建一個2G的文件系統,塊大小為2048byte,預留1%可用空間,文件系統ext4,卷標為TEST,要求此分區開機后自動掛載至/test目錄,且默認有acl掛載選項 2、寫一個腳本,完成如下功能: (1) 列出當前系統識別到的所有磁盤設備 (2) 如磁盤數量為1,則顯示其空間使用信息 …

    Linux干貨 2016-08-30
  • 十二.Linux博客-2016年8月16日文件查找和壓縮、rpm包管理、while循環、until循環

    格式說明: 操作 概念 命令 說明及舉例 十二.文件查找和壓縮、rpm包管理、yum、while循環、until循環 tar tar -zcvf /testdir/etc.tar.gz /etc/ 備份etc創建etc.tar.gz文件 壓縮為gz格式 顯示過程 tar -jcvf&nbs…

    Linux干貨 2016-08-24
  • N25期–第七周作業

    1、創建一個10G分區,并格式為ext4文件系統; fdisk /dev/sda n p 2 enter +10G w partx -a /dev/sda (1) 要求其block大小為2048, 預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl; mke2fs -t ext4 -…

    Linux干貨 2017-02-20
  • php 設計模式-數據映射模式(應用程序與數據庫交互模式)

    前面提到的設計模式大大提高了代碼的可讀性與可維護性。然而,在WEB應用設計與開發中一個基本的需求與挑戰:數據庫應用,這些設計模式都沒有涉及到。數據映射模式使您能更好的組織你的應用程序與數據庫進行交互。 下面我將用實際代碼說明,如果一個表發生變動。我們要修改客戶端代碼就可以了。特別是游戲項目,需求經常可能會經常變動。修改表結構,可能引起大片代碼的改動。 首先我…

    Linux干貨 2015-04-07
  • openssl總結及私有CA的搭建

    一、前言 什么是openssl?講openssl之前我們先了解一下什么是ssl?ssl是secure socket layer的簡稱,其使用對稱加密,非對稱加密(公鑰加密解密),單向加密解密結合證書實現數據傳輸安全,openssl默認是在系統安裝時就已經安裝上去的。隨著互聯網的迅速發展,網絡通信已經成為傳遞信息的主要途徑。而通信時的數據傳輸大部分都是明文傳輸…

    Linux干貨 2016-01-05

評論列表(1條)

  • N24_Jerry
    N24_Jerry 2017-04-20 17:07

    通俗易懂,邏輯清晰,循環漸進,實乃經典中的經典??!

欧美性久久久久