1. 程式人生 > >Sed 文字處理工具原理及使用

Sed 文字處理工具原理及使用

Sed是一種非互動式的流編輯器,可動態編輯檔案;流編輯器則會在編輯器處理資料之前基於預先提供的一組規則來編輯資料流。
Sed本身是一個管道命令,可以分析 standard input 的,主要是用來分析關鍵字的使用、統計等,此外還可以將資料進行替換、刪除、選中、選取特定行等功能
Sed主要用來自動編輯一個或多個檔案,可以將資料行進行替換、刪除、新增、選取等特定工作,簡化對檔案的反覆操作,編寫轉換程式等
引數選項
-e :直接在命令列模式上進行sed動作編輯,此為預設選項;
-f :將sed的動作寫在一個檔案內,用–f filename 執行filename內的sed動作;
-i :直接修改檔案內容;
-n :只打印模式匹配的行;
-r :支援擴充套件表示式;
-h或–help:顯示幫助;
-V或–version:顯示版本資訊

sed元字符集:
^ 匹配行開始,如:/^sed/匹配所有以sed開頭的行; $ 匹配行結束,如:/sed$/匹配所有以sed結尾的行; .
匹配一個非換行符的任意字元,如:/s.d/匹配s後接一個任意字元,最後是d;
匹配0個或多個字元,如:/*sed/匹配所有模板是一個或多個空格後緊跟sed的行; []
匹配一個指定範圍內的字元,如/[ss]ed/匹配sed和Sed; [^]
匹配一個不在指定範圍內的字元,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行;
\ (…\ )匹配子串,儲存匹配的字元,如s/(love)able/\1rs,loveable被替換成lovers; &
儲存搜尋字元用來替換其他字元,如s/love/&

/,love這成love; < 匹配單詞的開始,如:/\ >
匹配單詞的結束,如/love>/匹配包含以love結尾的單詞的行; x{m}
重複字元x,m次,如:/0{5}/匹配包含5個0的行; x{m,}
重複字元x,至少m次,如:/0{5,}/匹配至少有5個0的行;
x{m,n} 重複字元x,至少m次,不多於n次,如:/0{5,10}/匹配5~10個0的行;

測試:

  • 替換操作 ss/將要被替換的內容/替換內容/
    1、例如:將/etc/passwd下的bash替換成aaa
    在這裡插入圖片描述
    2、只打印被替換的行
    在這裡插入圖片描述
    3、檔案中每一行的第一個aa替換為kk
    在這裡插入圖片描述
  • 全域性替換
    1、將檔案中所有的都替換
    在這裡插入圖片描述
    2、指定需要從第N處匹配開始替換時,可以使用 /Ng
    在這裡插入圖片描述
  • 刪除:d
    在這裡插入圖片描述
  • 定界符
    以上命令中字元 / 在sed中作為定界符使用,也可以使用任意的定界符
    在這裡插入圖片描述
    定界符出現在樣式內部時,需要進行轉義
    在這裡插入圖片描述
  • 已匹配字串標記&
    正則表示式 \word+ 匹配每一個單詞,使用 [&] 替換它,& 對應於之前所匹配到的單詞
    在這裡插入圖片描述
    - 子串匹配標記: \ (…\ ) 匹配子串,儲存匹配的字元,如s/(love)able/\1rs,loveable被替換成lovers;
    在這裡插入圖片描述+重複前面的字元
    在這裡插入圖片描述
    - 多點編輯:e(-e選項允許在同一行裡執行多條命令)
    在這裡插入圖片描述
    上面sed表示式的第一條命令刪除1至3行,第二條命令用 F 替換 f 。命令的執行順序對結果有影響。如果兩個命令都是替換命令,那麼第一個替換命令將影響第二個替換命令的結果。
  • 從檔案讀入:r
    file裡的內容被讀進來,顯示在filename裡與ABCD匹配的行後面,如果匹配多行,則file的內容將顯示在所有匹配行的下面
    在這裡插入圖片描述
    在這裡插入圖片描述
  • 寫入檔案:w
    在filename中所有包含abc的行都被寫入file裡
    在這裡插入圖片描述
    在這裡插入圖片描述
    注意w具有覆蓋功能,它會覆蓋檔案裡原有的內容
  • 追加(行下):a
    將 this is a test line 追加到 以f開頭的行後面
    在這裡插入圖片描述
    第2行之後插入
    在這裡插入圖片描述
  • 插入(行上)
    在這裡插入圖片描述
    在第6行之後插入
    在這裡插入圖片描述
  • 下一個:n
    如果test被匹配,則移動到匹配行的下一行,替換這一行的aa,變為bb,並列印該行,然後繼續
    在這裡插入圖片描述
  • 轉換:y
    #把1~10行內所有abcde轉變為大寫,注意,正則表示式元字元不能使用這個命令
    在這裡插入圖片描述
    - 只顯示IP地址
    在這裡插入圖片描述
  • 去掉ssh配置檔案中的帶#行和空行
    在這裡插入圖片描述
    在這裡插入圖片描述
    在這裡插入圖片描述

練習

拷貝Week41.config檔案並完成以下練習
在這裡插入圖片描述
1. 把Jon的名字改為Jonathan
在這裡插入圖片描述
在這裡插入圖片描述
2. 刪除頭3行
在這裡插入圖片描述
3. 列印第5~10行
在這裡插入圖片描述
4. 刪除含有Lane的所有行
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
5. 列印所有生日在十一月或十二月的行
在這裡插入圖片描述
6. 在以Kare開頭的行末尾加上3顆星
在這裡插入圖片描述
7. 將所有包含Jose的行都替換為JOSE HAS RETIRED
在這裡插入圖片描述
8. 把Popeye的生日改為11/14/46,假定您不知道Popeye的生日,設法用正則式查找出來
在這裡插入圖片描述
9. 刪除所有空行

在這裡插入圖片描述