文本處理三劍客:sed簡介

文本處理三劍客:sed簡介

sed是一種流編輯器,處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。

處理過程

sed命令將當前處理的行讀入模式空間(pattern space)進行處理,sed在該行上執行完所有命令后就將處理好的行打印到屏幕上(除非之前的命令刪除了該行),sed處理完一行就將其從模式空間中刪除,然后將下一行讀入模式空間,進行處理、顯示。處理完文件的最后一行,sed便結束運行。sed在臨時緩沖區(模式空間)對文件進行處理,所以不會修改原文件,除非顯示指明-i選項。

語法

sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)

選項

-n:不輸出模式空間的內容至屏幕,僅顯示script處理后的結果;
-e<script>:以選項中的指定的script來處理輸入的文本文件;
-f<script文件>:以選項中指定的script文件來處理輸入的文本文件;
-r, --regexp-extended:支持使用擴展正則表達式;
-i :直接修改讀取的文件內容,而不是輸出到終端

地址定界

(1) 空地址:對全文進行處理;
(2) 單地址:
    #:指定行;
    /pattern/:被此模式所匹配到的每一行;
(3) 地址范圍
    #1,#2:從#1行到#2行
    #1,+#2:,從#1行開始到在增加+#2行
    #,/pat1/,從第#行開始到第一次匹配到pat1行
    /pat1/,/pat2/,從匹配pat1行到匹配pat2行
    $:最后一行;
(4) 步進:~
    1~2:所有奇數行
    2~2:所有偶數行

參數

文件:指定待處理的文本文件列表。

編輯命令

d:刪除;
p:顯示模式空間中的內容,通常 p 會與參數 sed -n 一起運行;
a  \text:在行后面追加文本“text”,支持使用\n實現多行追加; 
i  \text:在行前面插入文本“text”,支持使用\n實現多行插入; 
c  \text:把匹配到的行替換為此處指定的文本“text”;
w /PATH/TO/SOMEFILE:保存模式空間匹配到的行至指定的文件中;
r  /PATH/FROM/SOMEFILE:讀取指定文件的內容至當前文件被模式匹配到的行后面;文件合并;
=:為模式匹配到的行打印行號;
!:條件取反;
    地址定界!編輯命令;
s///:查找替換,其分隔符可自行指定,常用的有s@@@, s###等;
    替換標記:
        g:全局替換;
        w /PATH/TO/SOMEFILE:將替換成功的結果保存至指定文件中;
        p:顯示替換成功的行;

高級編輯命令

h:把模式空間中的內容覆蓋至保持空間中;
H:把模式空間中的內容追加至保持空間中;
g:把保持空間中的內容覆蓋至模式空間中;
G:把保持空間中的內容追加至模式空間中;
x:把模式空間中的內容與保持空間中的內容互換;
n:覆蓋讀取匹配到的行的下一行至模式空間中;
N:追加讀取匹配到的行的下一行至模式空間中;
d:刪除模式空間中的行;
D:刪除多行模式空間中的所有行;

實例

[root@localhost ~]# cat -n  /tmp/test
 1  HELLO LINUX!  
 2
 3  Linux is a free unix-type opterating system.  
 4
 5  This is a linux testfile!  
 6
 7  Linux test 

替換操作 字符替換 s///

  • 替換linux為LINUX
    [root@localhost ~]# sed 's/linux/LINUX/' /tmp/test
    HELLO LINUX!  
    
    Linux is a free unix-type opterating system.  
    
    This is a LINUX testfile!  
    
    Linux test 
    
  • 僅顯示替換行 p 和 -n一起使用
    [root@localhost ~]# sed -n 's/linux/LINUX/p' /tmp/test
    This is a LINUX testfile!  
    

行替換

  • 替換n行(替換第二行)
    [root@localhost ~]# sed '2chello linxu' /tmp/test
    HELLO LINUX!  
    hello linxu
    Linux is a free unix-type opterating system.  
    
    This is a linux testfile!  
    
    Linux test 
    
  • 替換第n到m行(第一到第三行)
    [root@localhost ~]#  sed '1,3chello linxu\nlet go' /tmp/test
    hello linxu
    let go
    
    This is a linux testfile!  
    
    Linux test 
    
  • 把有word行替換(替換有HELLO的行)
    [root@localhost ~]# sed '/HELLO/chello linxu' /tmp/test
    hello linxu
    
    Linux is a free unix-type opterating system.  
    
    This is a linux testfile!  
    
    Linux test 
    

刪除

  • 刪除第n行(刪除第一行)
    [root@localhost ~]# sed '1d' /tmp/test
    
    Linux is a free unix-type opterating system.  
    
    This is a linux testfile!  
    
    Linux test 
    
  • 刪除第n行和第m行(第一行和第四行)
    [root@localhost ~]# sed  -e '1d' -e '4d' /tmp/test
    
    Linux is a free unix-type opterating system.  
    This is a linux testfile!  
    
    Linux test 
    
  • 刪除第n行到m行(刪除第一行到第三行)
    [root@localhost ~]# sed '1,3d' /tmp/test
    
    This is a linux testfile!  
    
    Linux test 
    
  • 刪除還有字符串xxx的行(帶linux的行)
    [root@localhost ~]# sed '/linux/d' /tmp/test
    HELLO LINUX!  
    
    Linux is a free unix-type opterating system.  
    
    
    Linux test 
    
    [root@localhost ~]# sed '/^Linux/d' /tmp/test   //刪除Linux開頭的行
    HELLO LINUX!  
    
    
    This is a linux testfile!  
    
  • 刪除從第n行到帶有word的行(第三行到Linux的行)
    [root@localhost ~]# sed '3,/linux/d' /tmp/test
    HELLO LINUX!  
    
    
    Linux test 
    
  • 刪除從有word1行到有word2行(is,linux)
    [root@localhost ~]# sed '/is/,/linux/d' /tmp/test
    HELLO LINUX!  
    
    
    Linux test 
    
  • 刪除空白行
    [root@localhost ~]# sed '/^$/d' /tmp/test
    HELLO LINUX!  
    Linux is a free unix-type opterating system.  
    This is a linux testfile!  
    Linux test 
    

地址定界

[root@localhost ~]# cat /tmp/test1
linux
linux linux
linux linux linux
linux linux linux linux
linux
linux
linux
  • 默認替換每行第一個匹配字符
    [root@localhost ~]# sed 's/linux/LINUX/' /tmp/test1
    LINUX
    LINUX linux
    LINUX linux linux
    LINUX linux linux linux
    LINUX
    LINUX
    LINUX
    
  • 全面替換g
    [root@localhost ~]# sed 's/linux/LINUX/g' /tmp/test1
    LINUX
    LINUX LINUX
    LINUX LINUX LINUX
    LINUX LINUX LINUX LINUX
    LINUX
    LINUX
    LINUX
    
  • 替換第n行全部匹配字符(第二行)
    [root@localhost ~]# sed '2s/linux/LINUX/g' /tmp/test1
    linux
    LINUX LINUX
    linux linux linux
    linux linux linux linux
    linux
    linux
    linux
    
  • 替換第n行匹配的第m個字符(第四行第二個字符)
    [root@localhost ~]# sed '4s/linux/LINUX/2' /tmp/test1
    linux
    linux linux
    linux linux linux
    linux LINUX linux linux
    linux
    linux
    linux
    
  • 替換第n行匹配的第m開始到最后一個(第四行第二個字符開始)
    [root@localhost ~]# sed '4s/linux/LINUX/2g' /tmp/test1
    linux
    linux linux
    linux linux linux
    linux LINUX LINUX LINUX
    linux
    linux
    linux
    

已匹配字符串標記:&

  • 正則表達式 \w+ 匹配每一個單詞,使用 [&] 替換它,& 對應于之前所匹配到的單詞
    [root@localhost ~]# echo I LOVE LINUX | sed 's/\w\+/[&]/g'
    [I] [LOVE] [LINUX]
    
  • 以192.168.0.1開頭的行都會被替換成它自已加localhost
    sed 's/^192.168.0.1/&localhost/' file
    192.168.0.1localhost
    

子串匹配標記:\1

\(..\) 用于匹配子串,對于匹配到的第一個子串就標記為 \1,依此類推匹配到的第二個結果就是 \2

  • 匹配給定樣式的其中一部分
    [root@localhost ~]# echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'          \\digit 7被替換成了 7
    this is 7 in a number
    
  • 匹配2個部分
    [root@localhost ~]# echo aaa BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'
    BBB aaa
    
  • love被標記為1,所有loveable會被替換成lovers
    echo loveable | sed -n 's/\(love\)able/\1rs/p'
    

從文件讀入:r命令

  • 讀取test1文件的內容,顯示在test文件匹配行的后面,如果多行匹配,test1文件內容將顯示在所有匹配行的下面
    [root@localhost ~]# sed '/linux/r /tmp/test1' /tmp/test
    HELLO LINUX!  
    
    Linux is a free unix-type opterating system.  
    
    This is a linux testfile!  
    linux
    linux linux
    linux linux linux
    linux linux linux linux
    linux
    linux
    linux
    
    Linux test 
    

在行后追加文本:a\

  • 匹配linux行后插入
    [root@localhost ~]# sed '/linux/a\hello everyone' /tmp/test
    HELLO LINUX!  
    
    Linux is a free unix-type opterating system.  
    
    This is a linux testfile!  
    hello everyone
    
    Linux test 
    
  • 第二行后插入
    [root@localhost ~]# sed '2a\hello everyone' /tmp/test
    HELLO LINUX!  
    
    hello everyone
    Linux is a free unix-type opterating system.  
    
    This is a linux testfile!  
    
    Linux test 
    

在行前追加文本:i\

  • 匹配linux行前插入 [root@localhost ~]# sed ‘/linux/i\hello everyone’ /tmp/test HELLO LINUX!
    Linux is a free unix-type opterating system.  
    
    hello everyone
    This is a linux testfile!  
    
    Linux test 
    [root@localhost ~]# 
    
  • 第二行前插入
    [root@localhost ~]# sed '2i\hello everyone' /tmp/test
    HELLO LINUX!  
    hello everyone
    
    Linux is a free unix-type opterating system.  
    
    This is a linux testfile!  
    
    Linux test 
    

寫入文件:w

  • 打開test文件,把匹配的行寫入test2文件中,并在屏幕中不輸出(-n)
    [root@localhost ~]# sed -n '/linux/w /tmp/test2' /tmp/test
    [root@localhost ~]# cat /tmp/test2
    This is a linux testfile!  
    

高級編輯命令相關實例

覆蓋讀取匹配到的行的下一行至模式空間中:n

  • 匹配行的下一行,進行替換并輸出
    [root@localhost ~]# sed '/linux/{n;s/linux/LINUX/}' /tmp/test1
    linux
    LINUX linux
    linux linux linux
    LINUX linux linux linux
    linux
    LINUX
    linux
    
  • 輸出偶數行
    [root@localhost ~]# sed -n 'n;p' /tmp/test1
    linux linux
    linux linux linux linux
    linux
    
  • 顯示奇數行;
    [root@localhost ~]# sed 'n;d' /tmp/test3
    HELLO LINUX!
    This is a linux testfile!
    
  • 取出最后一行
    [root@localhost ~]# sed '$!d' /tmp/test3
    Linux test
    
  • 在原有的每行后方添加一個空白行
    [root@localhost ~]# sed 'G' /tmp/test3
    HELLO LINUX!
    
    Linux is a free unix-type opterating system.
    
    This is a linux testfile!
    
    Linux test
    
    [root@localhost ~]# 
    
  • 取出文件后兩行
    [root@localhost ~]# sed '$!N;$!D' /tmp/test3
    This is a linux testfile!
    Linux test
    
  • 刪除原有的所有空白行,而后為所有的非空白行后添加一個空白行;
    [root@localhost ~]# cat -n /tmp/test
         1  HELLO LINUX!  
         2
         3  Linux is a free unix-type opterating system.  
         4
         5  This is a linux testfile!  
         6
         7  Linux test 
    [root@localhost ~]# sed '/^$/d;G ' /tmp/test | cat -n
         1  HELLO LINUX!  
         2
         3  Linux is a free unix-type opterating system.  
         4
         5  This is a linux testfile!  
         6
         7  Linux test 
         8
    
  • 逆序顯示文件的內容
    [root@localhost ~]# cat /tmp/test3
    HELLO LINUX!
    Linux is a free unix-type opterating system.
    This is a linux testfile!
    Linux test
    
    [root@localhost ~]# sed  '1!G;h;$!d' /tmp/test3
    Linux test
    This is a linux testfile!
    Linux is a free unix-type opterating system.
    HELLO LINUX!
    
    
    1!G:如果不是第一行,把保持空間中的內容追加至模式空間中
    h:把模式空間中的內容覆蓋至保持空間中
    $!d:如果不是最后一行,刪除模式空間中的行
    
    先把保持空間的內容追加到模式空間,在把模式空間的內容覆蓋到保持空間,然后刪除模式空間的內容

 

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/94811

(1)
eighteenxueighteenxu
上一篇 2018-04-03
下一篇 2018-04-03

相關推薦

  • 文件查找和壓縮

    文件查找和壓縮 文件查找的兩個命令 locate find————————————————————-locate loc…

    Linux筆記 2018-04-14
  • 邏輯卷

    邏輯卷如果分區分區類型id8epvs查看現有的物理卷 或者pvdisplay(詳細)pvcreate /dev/sdd1 /dev/sdb 把硬盤和分區編程物理卷vgs查看現有的卷組 或者vgdisplay (詳細)vgcreate -s 16M vg0 /dev/sd{d1,b} 創建vg0卷組把sdd1和sdb加入卷組指定PE為16Mlvcreate -…

    Linux筆記 2018-04-30
  • 第十次筆記 二

    使用PEX和cobbleer實現網絡服務器自動化安裝系統

    2018-05-26
  • nginx實現請求轉發

    反向代理適用于很多場合,負載均衡是最普遍的用法。 nginx?作為目前最流行的web服務器之一,可以很方便地實現反向代理。 nginx?反向代理官方文檔:?NGINX REVERSE PROXY 當在一臺主機上部署了多個不同的web服務器,并且需要能在80端口同時訪問這些web服務器時,可以使用?nginx?的反向代理功能: 用?nginx?在80端口監聽所…

    Linux筆記 2018-07-08
  • Linux系統目錄簡介

    幫助理解linux系統目錄結構和作用

    2018-04-15
  • 小白的隨堂筆記(重定向,管道,用戶和組,文本工具)

    重定向 把輸出和錯誤輸出定向到新文件中 c 操作符號 /> 標準輸出重定向 把標準輸出重定向到文件(可覆蓋原有文件) 2> 錯誤輸出重定向 把錯誤輸出重定向到文件(可覆蓋原有文件) &> 把所有輸出重定向到文件 >> 所有內容基礎上,追加內容 2>> 追加重定向錯誤輸出數據流 &>> 追加…

    2018-04-08

評論列表(1條)

  • leo
    leo 2018-04-05 16:34

    可以舉個例子解釋命令的選項, 這樣可以記憶更深刻

欧美性久久久久