1. 程式人生 > >文本處理工具之SED流編輯器

文本處理工具之SED流編輯器

fstab文件 屏幕 編輯器 常用 多行模式 表達式 重定向 等價 內容

文本處理三劍客之SED(流編輯器)

sed的工作方式:在指定文件中,按行讀取內容至模式空間,然後根據sed的scripts編輯改行內容,編輯完畢後輸出至屏幕,再讀取下一行進行處理。如果有該行內容未被處理完畢就有新的內容要進行編輯,則把該行內容移至保持空間中,,保持空間中的內容可以隨時調回模式空間中。

sed的使用

使用格式:sed [options...] ‘scipts‘ file

  • 常用選項:
  • -n:不輸出模式空間中的內容至標準輸出(不自動打印)
  • -e script:多點編輯
    sed -e ‘[email protected]^#[[:space:]]@[email protected]‘ -e ‘/^UUID/‘ /etc/fatab
  • -f sed_script_fie:調用sed的編輯腳本文件(文件中每行一個編輯腳本)
  • -r:支持使用擴展正則表達式
  • -i:直接編輯源文件
  • -i.bak:備份源文件並在原文編輯

地址定界機制:

  • 空地址:對全文進行處理
    1. 單地址
      • #:指定第#行
      • $:最後一行
      • /pattern/:被此模式所匹配到的行
    2. 地址範圍:
      • #,#:第#行到第#行
      • #,+#:第#行到#+#行
      • #,/pattern/:第#行到被模式匹配到的行
      • /pattern1/,/pattern2/:第一次被模式1匹配到的行到第一次被模式2匹配到的行
    3. 步進:~
      • 1~2:所有奇數行
      • 2~2:所有偶數行

        編輯命令:

  • d:刪除
  • p:顯示模式空間中的內容
  • a \test:在行後面追加文本“test”,支持使用\n實現多行追加
  • i \test:在行前面追加文本“test”支持使用\n實現多行追加

    追加的時候,要插入變量使用‘‘‘$變量‘‘‘

  • c \test:把匹配到的行替換為此處指定的文本
  • w file:保存模式空間中的內容至文件中,相當於重定向
  • r file:讀取指定文件中的內容自己當前文件被模式匹配的行的後面
  • =:為模式匹配到的行打印行號
  • !:條件取反
  • s///:查找替換,其分隔符可自定義,常用的有[email protected]@@,s###等

    替換標記:

    • g:全局替換
    • w file:將替換完的結果保存到指定文件中
    • p:顯示替換成功的行
      支持使用\1,\2...後向引用,&表示全面搜索到的全部內容

練習

  • 刪除/boot/grub/grub2.cfg文件中所有以空白字符開頭的行的行首的所有空白字符;
    ~]# sed ‘[email protected]^[[:space:]][email protected]@‘ /etc/grub2.cfg
    1. 刪除/etc/fstab文件中所有以#開頭的行的行首的#號及#後面的所有空白字符;
      ~]# sed ‘[email protected]^#[[:space:]]*@@‘ /etc/fstab
    2. 在/etc/grub2.cfg文件中包含linux16的行的行尾加上net.ifnames=0
      sed -nr ‘/linux16/s/.*/& net.ifnames=0/p‘ /etc/grub2.cfg

      sed的高級編輯命令:

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

    示例:

    1. sed -n ‘n;p‘ FILE:顯示偶數行;
    2. sed ‘n;d‘ FILE:顯示奇數行;
    3. sed ‘1!G;h;$!d‘ FILE:逆序顯示文件的內容; 等價於sed -n ‘1!G;h;$p‘
    4. sed ’$!d‘ FILE:取出最後一行;
    5. sed ‘$!N;$!D‘ FILE:取出文件後兩行;
    6. sed ‘N;D‘:取出最後一行;
    7. sed ‘/^$/d;G‘ FILE:刪除原有的所有空白行,而後為所有的非空白行後添加一個空白行;
    8. sed ‘G‘ FILE:在原有的每行後方添加一個空白行;

文本處理工具之SED流編輯器