文本處理三劍客: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 13:24
下一篇 2018-04-03 13:37

相關推薦

  • zabbix監控系統

    zabixx zabbix(音同 zæbix)是一個基于WEB界面的提供分布式系統監視以及網絡監視功能的企業級的開源解決方案。 zabbix能監視各種網絡參數,保證服務器系統的安全運營;并提供靈活的通知機制以讓系統管理員快速定位/解決存在的各種問題。 zabbix由2部分構成,zabbix server與可選組件zabbix agent。 zab…

    2018-07-22
  • MySQL之存儲引擎及索引

    什么是MySQL的存儲引擎?MySQL中索引的作用是什么?本節內容將為你解答

    2018-06-11
  • Ansible使用介紹(一)基本概念及常用模塊

    隨著運維自動化經歷了從本地部署到基礎設施即服務(IaaS)、平臺即服務(PaaS)在到軟件即服務(SaaS)的發展階段,掌握多種自動化運維工具就成了運維人員必備技能之一,ansible就是目前國內使用比較廣泛的自動化運維工具之一。

    2018-05-29
  • d

    ““ function fun(){ echo “這是一句非常牛逼的代碼”;}fun(); ““

    Linux筆記 2018-07-09
  • Linux

    Linux 系統啟動過程和Linux系統目錄介紹

    Linux筆記 2018-04-05
  • N30-bash特性以及Linux文件管理常用命令匯總

    1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。 文件管理類命令:cat,tac,head,tail,more,less 分屏查看命令:more,less more:more FILE特點,翻盤至文件尾部后自動退出 less FILE head:查看文件的前n行head [options] FILE-n 數字-數字 tail:查看…

    Linux筆記 2018-05-26

評論列表(1條)

  • leo
    leo 2018-04-05 16:34

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

欧美性久久久久