shell編程之正則表達式(二)sed工具

sed 工具

sed(Stream EDitor)是一個強大而簡單的文本解析轉換工具,可以讀取文本,並根據指定的條件對文本內容進行編輯(刪除、替換、添加、移動等),最後輸出所有行或者僅輸出處理的某些行。sed 也可以在無交互的情況下實現相當複雜的文本處理操作,被廣泛應用於 Shell 腳本中,用以完成各種自動化處理任務。
sed 的工作流程主要包括讀取、執行和顯示三個過程。

  • 讀取:sed 從輸入流(文件、管道、標準輸入)中讀取一行內容並存儲到臨時的緩

衝區中(又稱模式空間,pattern space)。

  • 執行:默認情況下,所有的 sed 命令都在模式空間中順序地執行,除非指定了行的地址,否則 sed 命令將會在所有的行上依次執行。
  • 顯示:發送修改後的內容到輸出流。再發送數據後,模式空間將會被清空。
    在所有的文件內容都被處理完成之前,上述過程將重複執行,直至所有內容被處理完。
    注意:默認情況下,所有的 sed 命令都是在模式空間內執行的,因此輸入的文件並不會發生任何變化,除非是用重定向存儲輸出。

1.sed 命令常見用法
通常情況下調用 sed 命令有兩種格式,如下所示。其中,“參數”是指操作的目標文件,當存在多個操作對象時用,文件之間用逗號“,”分隔;而 scriptfile 表示腳本文件,需要用“-f”選項指定,當腳本文件出現在目標文件之前時,表示通過指定的腳本文件來處理輸入的目標文件。

sed[選項] '操作' 參數
sed [選項] -f scriptfile 參數

常見的 sed 命令選項主要包含以下幾種。

  • -e 或--expression=:表示用指定命令或者腳本來處理輸入的文本文件。
  • -f 或--file=:表示用指定的腳本文件來處理輸入的文本文件。
  • -h 或--help:顯示幫助。
  • -n、--quiet 或 silent:表示僅顯示處理後的結果。
  • -i:直接編輯文本文件。
    “操作”用於指定對文件操作的動作行爲,也就是 sed 的命令。通常情況下是採用的“[n1[,n2]]”操作參數的格式。n1、n2 是可選的,不一定會存在,代表選擇進行操作的行數,如操作需要在 5~20 行之間進行,則表示爲“5,20 動作行爲”。常見的操作包括以下幾種。
  • a:增加,在當前行下面增加一行指定內容。
  • c:替換,將選定行替換爲指定內容。
  • d:刪除,刪除選定的行。
  • i:插入,在選定行上面插入一行指定內容。
  • p:打印,如果同時指定行,表示打印指定行;如果不指定行,則表示打印所有內容;如果有非打印字符,則以 ASCII 碼輸出。其通常與“-n”選項一起使用。
  • s:替換,替換指定字符。
  • y:字符轉換。
    用法實例:
    輸出符合條件的文本(p 表示正常輸出)
    [root@localhost ~]# sed -n 'p' test.txt
    #輸出所有內容,等同於 cat test.txt

    shell編程之正則表達式(二)sed工具

    [root@localhost ~]# sed -n '3p' test.txt    
    #輸出第 3 行

    shell編程之正則表達式(二)sed工具

    [root@localhost ~]# sed -n '3,5p' test.txt 
    #輸出 3~5 行

    shell編程之正則表達式(二)sed工具

    [root@localhost ~]# sed -n 'p;n' test.txt
    #輸出所有奇數行,n 表示讀入下一行資料

    shell編程之正則表達式(二)sed工具

    [root@localhost ~]# sed -n 'n;p' test.txt
    #輸出所有偶數行,n 表示讀入下一行資料

    shell編程之正則表達式(二)sed工具

    [root@localhost ~]# sed -n '1,5{p;n}' test.txt
    #輸出第 1~5 行之間的奇數行(第 1、3、5 行)

    shell編程之正則表達式(二)sed工具

    [root@localhost ~]# sed -n '10,${n;p}' test.txt
    #輸出第 10 行至文件尾之間的偶數行

    shell編程之正則表達式(二)sed工具
    在執行“sed –n‘10,${n;p}’test.txt”命令時,讀取的第 1 行是文件的第 10 行,
    讀取的第 2 行是文件的第 11 行,依此類推,所以輸出的偶數行是文件的第 11 行、13 行直至文件結尾,其中包括空行。

以上是 sed 命令的基本用法,sed 命令結合正則表達式時,格式略有不同,正則表達式以“/”包圍。例如,以下操作是 sed 命令與正則表達式結合使用的示例。

[root@localhost ~]# sed -n '/the/p' test.txt    
#輸出包含the 的行

shell編程之正則表達式(二)sed工具

[root@localhost ~]# sed -n '4,/the/p' test.txt
#輸出從第 4 行至第一個包含 the 的行

shell編程之正則表達式(二)sed工具

[root@localhost ~]# sed -n '/the/=' test.txt
#輸出包含the 的行所在的行號,等號(=)用來輸出行號

shell編程之正則表達式(二)sed工具

[root@localhost ~]# sed -n '/^PI/p' test.txt    
//輸出以PI開頭的行

shell編程之正則表達式(二)sed工具

[root@localhost ~]# sed -n '/[0-9]$/p' test.txt 
#輸出以數字結尾的行

shell編程之正則表達式(二)sed工具

[root@localhost ~]# sed -n '/\<wood\>/p' test.txt
#輸出包含單詞wood 的行,\<、\>代表單詞邊界

shell編程之正則表達式(二)sed工具
刪除符合條件的文本(d)
因爲後面的示例還需要使用測試文件 test.txt,所以在執行刪除操作之前需要先將測試文件備份。以下示例分別演示了 sed 命令的幾種常用刪除用法。
下面命令中 nl 命令用於計算文件的行數,結合該命令可以更加直觀地查看到命令執行的結果。

[root@localhost ~]# nl test.txt | sed '3d'  
#刪除第 3 行

shell編程之正則表達式(二)sed工具

[root@localhost ~]# nl test.txt | sed '3,5d'    
#刪除第 3~5 行

shell編程之正則表達式(二)sed工具

[root@localhost ~]# nl test.txt |sed '/the/d'
//刪除包含the 的行,原本the的行被刪除

shell編程之正則表達式(二)sed工具

[root@localhost ~]# sed '/^[a-z]/d' test.txt    
#刪除以小寫字母開頭的行

shell編程之正則表達式(二)sed工具

[root@localhost ~]# sed '/\.$/d' test.txt   
#刪除以"."結尾的行

shell編程之正則表達式(二)sed工具

[root@localhost ~]# sed '/^$/d' test.txt    
#刪除所有空行

shell編程之正則表達式(二)sed工具
注意: 若是刪除重複的空行,即連續的空行只保留一個, 執行“ sed –e ‘/^$/{n;/^$/d}’test.txt”命令即可實現。其效果與“cat -s test.txt”相同,n 表示讀下一行數據。
替換符合條件的文本
在使用 sed 命令進行替換操作時需要用到 s(字符串替換)、c(整行/整塊替換)、y(字符轉換)命令選項,常見的用法如下所示。

  • sed 's/the/THE/' test.txt //將每行中的第一個the 替換爲 THE
  • sed 's/l/L/2' test.txt //將每行中的第 2 個l 替換爲L
  • sed 's/the/THE/g' test.txt //將文件中的所有the 替換爲THE
  • sed 's/o//g' test.txt //將文件中的所有o 刪除(替換爲空串)
  • sed 's/^/#/' test.txt //在每行行首插入#號
  • sed '/the/s/^/#/' test.txt //在包含the 的每行行首插入#號
  • sed 's/$/EOF/' test.txt //在每行行尾插入字符串EOF
  • sed '3,5s/the/THE/g' test.txt //將第 3~5 行中的所有the 替換爲 THE
  • sed '/the/s/o/O/g' test.txt //將包含the 的所有行中的o 都替換爲 O
    遷移符合條件的文本
    其中,H,複製到剪貼板;g、G,將剪貼板中的數據覆蓋/追加至指定行;w,保存爲文件;r,讀取指定文件;a,追加指定內容。
    sed '/the/{H;d};$G' test.txt //將包含the 的行遷移至文件末尾,{;}用於多個操作sed '1,5{H;d};17G' test.txt //將第 1~5 行內容轉移至第 17 行後
  • sed '/the/w out.file' test.txt //將包含the 的行另存爲文件out.file
  • sed '/the/r /etc/hostname' test.txt //將文件/etc/hostname 的內容添加到
    //包含the 的每行以後
  • sed '3aNew' test.txt //在第 3 行後插入一個新行,內容爲 New
  • sed '/the/aNew' test.txt //在包含the 的每行後插入一個新行,內容爲 New
  • sed '3aNew1\nNew2' test.txt //在第 3 行後插入多行內容,中間的\n 表示換行
    使用腳本編輯文件
    使用 sed 腳本,將多個編輯指令存放到文件中(每行一條編輯指令),通過“-f”選項來調用。例如:
    sed '1,5{H;d};17G' test.txt //將第 1~5 行內容轉移至第 17 行後
    以上操作可以改用腳本文件方式:
    [root@localhost ~]# vi opt.list 1,5H
    1,5d
    17G
    [root@localhost ~]# sed -f opt.list test.txt
    The year ahead will test our political establishment to the limit.
    PI=3.141592653589793238462643383249901429
    a wood cross!
    Actions speak louder than words
    #woood # #woooooood # AxyzxyzxyzxyzC
    I bet this place is really spooky late at night! Misfortunes never come alone/single.
    I shouldn't have lett so tast.
    he was short and fat.
    He was wearing a blue polo shirt with black pants. The home of Football on BBC Sport online.
    the tongue is boneless but it breaks bones.12! google is the best tools for search keyword.

    6)sed 直接操作文件示例
    編寫一個腳本,用來調整 vsftpd 服務配置:禁止匿名用戶,但允許本地用戶(也允許寫入)。

    [root@localhost ~]# vim local_only_ftp.sh #!/bin/bash
    #指定樣本文件路徑、配置文件路徑
    SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf " CONFIG="/etc/vsftpd/vsftpd.conf"
    #備份原來的配置文件,檢測文件名爲/etc/vsftpd/vsftpd.conf.bak 備份文件是否存在, 若不存在則使用 cp 命令進行文件備份
    [ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak # 基於樣本配置進行調整,覆蓋現有文件
    sed -e '/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG
    sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIG grep "listen" $CONFIG || sed -i '$alisten=YES' $CONFIG
    #啓動vsftpd 服務,並設爲開機後自動運行systemctl restart vsftpd
    systemctl enable vsftpd
    [root@localhost ~]# chmod +x local_only_ftp.sh
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章