Linux文本處理三劍客之 sed流編輯器

sed (Stream Editor) 流編輯器

sed工作模式

  依次從文件中讀取一行,不編輯源文件;符合要求的行(能被模式匹配到的行)送到“模式空間 (pattern space)”執行編輯或其他操作,而後把處理過的結果輸出至標準輸出(屏幕);不符合要求的行(不能被模式所匹配到的行)也輸出至標準輸出
  不管能否被“模式空間”所匹配到(除非遇到”d’命令),都會先輸出至屏幕(標準輸出)

Linux文本處理三劍客之 sed流編輯器

語法:sed [OPTION]... 'script' FILE...
   sed [OPTION]... 'COMMAND1[;COMMAND2]…' FILE…
   sed [OPTION]... 'ADDRESS_COMMAND' FILE…
   sed [OPTION]...'/PATTERN/COMMAND' FILE…
選項:
   -n:靜默模式;不輸出模式空間中的(原有)內容到屏幕(標準輸出)
   -i:直接修改原文件
   -e {SCRIPTS|COMMAND}:指定多個sed腳本(多點編輯)或編輯命令
   -f /PATH/TO/SED_SCRIPT_FILE:可以把sed的編輯命令放在一個文件當中;從指定文件中讀取編輯腳本(每行一個編輯命令)
   -r:使用擴展正則表達式

sed腳本 (script)

   sed腳本指的是:地址定界+編輯命令;sed腳本中,不能有引號(' ' " ")

地址定界 (ADDRESS)

  • 不給地址(空地址):對全文(每一行)進行處理
  • 單地址
     10
     10,
  • 地址範圍
     開始行,結束行(1,100)
     $:最後一行
     n!:除了第n行外的所有行
     '^$:空行
     開始行,+結束行(10,+2)
     從開始行開始,向後的2行
  • 模式
     / PATTERN /:被此模式所能匹配到的每一行
     /^PATTERN/:以指定模式開頭的行
     開始行,/ PATTERN /:從指定的行開始到第一次被模式匹配到的行,之間的所有行
     / PATTERN 1/,/ PATTERN 2/:從第一個符合模式1的行開始,到第二個符合模式2的行結束,中間的所有行
  • ~:步進
     顯示所有奇數行:1~2
     顯示所有偶數行:2~2
    正則表達式元字符:https://blog.51cto.com/zhangdaifu/1973716

sed的子命令 (COMMAND)

 多個子命令(COMMAND)用分號“;”分隔

編輯命令

  d:刪除符合條件的行;使用此編輯命令時需禁用’-n’選項(可以和地址定界,模式一同使用)
  p:顯示符合條件(地址定界中模式空間)的行
  a \TEXT:在匹配到的行後(下),追加一個或一些文本(新行);支持使用’-n’實現多行追加
  i \TEXT:在匹配到的行前(上),插入一個或一些文本(新行);支持使用’-n’實現多行插入
  c \ TEXT:把匹配到的行替換成此處指定的文本在追加、替換、插入的時候,可以用“\n”換行

# sed '2a# New Line' /etc/fstab
# sed '/[[:space:]]/a \ 1 \n 2' /etc/fstab
# sed '2a# New Line 1\n# New Line 2' /etc/fstab
# sed '/^[[:upper:]]/i \New' /etc/fstab
# sed '/^[[:upper:]]/c \UUID' /etc/fstab

注意:sed的地址定界和編輯命令是不可分開的
  r /PATH/FROM/SOMEFILE:讀取指定文件的內容至當前文件被模式匹配到的行(下)後面;用於實現文件合併
  w /PATH/TO/SOMEFILE:保存(覆蓋)模式空間匹配到的行至指定的文件中;另存爲操作
  =:爲模式匹配到的行的行的前(上)面顯示行號
  !:條件取反;放在模式後面編輯命令之前(地址定界!編輯命令);對地址定界取反;除了對匹配到行以外的其他行,做出編輯操作
  SOMEFILE:某文件

# sed -n '/^[^#]/w /tmp/fstab.new' /etc/fstab
# sed "/^[^#]/w $(mktemp /tmp/XXX)" /etc/fstab
# sed '3r /etc/issue' /etc/fstab
# sed '/^UUID/=' /etc/fstab

注意:如果想在一個處理當中,執行多條子命令,則使用“;”隔開

查找替換

語法格式:s[/地址定界]/查找條件/替換內容/[修飾符]

注意:除“/”外,sed還支持使用其他字符作爲修飾符“@”“#”“|”__

  s:查找條件可以指“模式”
   查找條件可以使用模式,但要替換的內容不行
  y:逐個字符進行替換;和“s”不同的是,y將字符集替換成與之完全匹配的字符集(和tr命令一樣,但不支持正則表達式)
   # echo "ABC" | sed 'y/ABC/abc/'
   # sed 'y@UUID@uuid@' /etc/fstab

修飾符(替換標記)

  [N]g (global):第N處替換/行內全局替換; 默認替換一個
  i (ignore-case):匹配時,忽略字符大小寫
  &:引用模式匹配到的整個串
  p:顯示替換成功的行
  w /PATH/TO/SOMEFILE:將替換成功的結果保存至指定文件中

練習

1:刪除/boot/grub/grub2.cfg文件中所有以空白字符開頭的行的行首的所有空白字符

  # sed 's@^[[:space:]]*@@g' /boot/grub2/grub.cfg

2:刪除/etc/fstab文件中所有以#開頭的行的行首的#號及#後面的所有空白字符

  # sed 's@^#[[:space:]]*@@g' /etc/fstab

3:輸出一個絕對路徑給sed命令,取出其目錄,其行爲類似於dirname

  # echo /home/zhangdaifu | sed 's@[^/]+/\?$@@'
  # echo /home/zhangdaifu/ | sed -r 's@[^/]+/?$@@'

sed命令示例

  大部分以/etc/fstab文件爲例

顯示文件中所有內容

  sed '' FILE
  sed -n 'p' FILE

將文件複製一份

  sed 'w /tmp/fstab' /etc/fstab

不顯示以“/”開頭的行

   sed '/^\//d' /etc/fstab

不顯示以“#”開頭的行

  sed '/^#/d' FILE
  sed -n '/^[^#]/p' FILE
  sed -n '/^#/!p' FILE

顯示從第2行到第1個以“#”開頭的行

  sed '2,/^#/d' /etc/fstab

在所有以“#”開頭的行後,追加一句話

  sed '/^#/a \Hello' /etc/fstab

在所有以大寫字母開頭的行後,追加一句話

  sed '/^[[:upper:]]/a \new_line' /etc/fstab

在UUID開頭的行後插入/etc/issue文件中的內容

  sed '/^UUID/r/\/etc/issue' /etc/fstab

將“#”開頭的行保存到/tmp/test文件中

  sed -n '/^#/w /tmp/test' /etc/fstab

顯示以“#”開頭的行,並顯示行號

  sed '/^#/=' /etc/fstab

將#開頭的行刪除

  sed '/^#/d' /etc/fstab

將#開頭的行的#和空白行刪除

  sed -e 's/^#//' -e '/^$/d' /etc/fstab

將文件中除了#開頭的行,其餘全部刪除

  sed '/^#/!d' /etc/fstab

將文件中所有行的行首都加入#號

  sed 's/^/#/' /etc/fstab

給UUID所在行的UUID字符串加上雙引號

  sed 's/UUID/"&"/g' /etc/fstab

給UUID所在行加上雙引號

  sed -n 's@UUID.*@"&"@p' /etc/fstab

刪除UUID所在行

  sed -e 's/^#[[:space:]]*//' -e '/^UUID/d' /etc/fstab

高級編輯命令

sed的保持空間

  sed的所有編輯操作都在“模式空間”中進行編輯操作,編輯完之後如果還沒有編輯結束,可以將數據放置“操持空間 (HOLD SPACE)”中,而後再處理下一行,處理完之後可以把“操持空間”當中的數據拿回再次進行處理

模式空間 == 車間
操持空間 == 倉庫

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

sed調用shell變量

sed “$變量”
  # sed "s@\/bin\/sh@$SHELL@" /etc/shells

sed高級用法

顯示奇數行

  # sed 'n;d' FILE
  # sed -n '1~2p' FILE

顯示偶數行

  # sed -n 'n;p' FILE
  # sed '1~2d' FILE

刪除最後一行

  # sed -n 'N;p' FILE

取出最後一行

  # sed '$!d' FILE
  # sed -n '$p' FILE

取出最後兩行

  # sed '$!N;$!D' FILE

顯示包含數字的行

  # sed 'N;s/\n/\t/' FILE

在原有的每行後方添加一個空白行

  # sed 'G' FILE

刪除原有的所有空白行,而後爲所有的非空白行後添加一個空白行(將多個空白行合併爲一個,然後在每行後方添加一個空白行)

  # sed '/^$/d;G' FILE
  除了第一行:# sed '1!G' FILE

sed可以模擬一些命令

 取出文件頭五行(相當於head -5)

  # sed '5 q' FILE

 把文件創建一個副本(相當於cp命令)

  # sed -n 'w /PATH/TO/NEW_FILE' FILE

 統計文件中的行數(相當於wc -l)

  # sed -n '$ =' FILE

 逆向顯示文件內容(相當於tac)

  # sed '1!G;h;$!d' FILE
  # sed -n '1!G;h;$p' FILE

更多:https://www.yiibai.com/sed/sed_useful_recipes.html

-------------------------------------------------------------------The End-----------------------------------------------------------------
--------------------------------------------------------------------Thank-------------------------------------------------------------------
------------------------------------------------------------------ by: ZDF -----------------------------------------------------------------
blog:http://zhangdaifu.blog.51cto.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章