sed工具

文本處理sed

一:簡介

? Stream EDitor, 行編輯器
首先對于一個(gè)文本文件來說,它是由至上而下的一行或N行組成。
1、當(dāng)用sed命令對文本進(jìn)行處理的時(shí)候,sed先讀取對象的文本文件的第一行到模式空間中。
2、當(dāng)有內(nèi)容進(jìn)入“模式空間”時(shí),sed的編輯命令對模式空間中的內(nèi)容進(jìn)行編輯操作(修改,替換,刪除,追加,顯示等等)
3、模式空間中的內(nèi)容編輯處理完成之后,sed把此內(nèi)容通過標(biāo)準(zhǔn)輸出(默認(rèn)為顯示器)打印出來,并刪除模式空間中的內(nèi)容。
4、第一行處理結(jié)束。從新讀取第二行的內(nèi)容進(jìn)行處理,直到最后一行。

二:語法

? 用法:

sed [option]... 'script' inputfile...

? 常用選項(xiàng):

-n:不輸出模式空間內(nèi)容到屏幕,即不自動(dòng)打印
-e:  多點(diǎn)編輯
   eg: sed -e 's/dog/cat/' -e 's/hi/lo/' pets
-f:/ PATH/SCRIPT_FILE :  從指定文件中讀取編輯腳本
-r:  支持使用擴(kuò)展正則表達(dá)式
-i.bak:  備份文件并原處編輯(.bak是后綴名)
  eg : sed -i.bak '1-2d' f1
     將f1文件備份生成f1.bak文件,再進(jìn)行修改

? script: ’ 地址(要處理的行)+命令’

地址定界:
(1)  不給地址:對全文進(jìn)行處理
(2)  單地址:
      #:  指定的行
/pattern/ :被此處模式所能夠匹配到的每一行
        eg: sed -n /^r/ /etc/passwd
(3)  地址范圍:
      #,#
      #,+#
        eg: sed -n '3,+6p' /etc/passwd(取第三行,到往下的六行)
    /pat1/,/pat2/
        eg: sed -n '/^h/,/^s/p' /etc/passwd
    #,/pat1/
        eg: sed -n '2p,/^s/' /etc/passwd
(4) ~ :步進(jìn)

  1~2  奇數(shù)行(從第一行開始,每次加2)
  2~2  偶數(shù)行(從第二行開始,每次加2)
      eg: sed 100|sed '2~2p'

編輯命令:

d:  刪除模式空間匹配的行
    eg:sed '90d' f1 刪除第90行
p:  顯示模式空間中的內(nèi)容
    eg:sed '90p' f1 打印第90行
a [\]text :在指定行 后面 追加文本
   支持 使用\n (表示換行) 實(shí)現(xiàn)多行追加
     eg:sed '90anewline' f1
        sed '90a\new\nnewline\nnewline' f1
i [\]text :在行前面 插入文本
c [\]text :替換行為單行或多行文本
    eg: sed '10,90c\   new line1\nnew line2\nnewline3' f1
        把十到九十行都刪了用后面的內(nèi)容代替
w /path/somefile:  保存模式匹配的行至指定文件
    eg:sed '10,90w /root/f2' f1
       把f2的10到90行保存到f1
r /path/somefile :讀取指定文件的文本至模式空間中匹配到的行后
    eg: sed '10r /etc/issue' f1
       將/etc/issue讀入到f1的第10行后
=:  為模式空間中的行打印行號
    eg: sed '=' /etc/passwd


!:  模式空間中匹配行取反處理
    eg:sed -n '1~2!p' 取出偶數(shù)行

s/// :查找替換, 支持使用其它分隔符,s@@@

? 替換標(biāo)記:

  g:  行內(nèi)全局替換
  p:  顯示替換成功的行
  w  /PATH/TO/SOMEFILE :將替換成功的行
     eg:sed '2~2s/root/ROOT/g' f1 將偶數(shù)行的root替換成ROOT
高級編輯命令:
  h:  把模式空間中的內(nèi)容覆蓋至保持空間中
  H :把模式空間中的內(nèi)容追加至保持空間中
  g:  從保持空間取出數(shù)據(jù)覆蓋至模式空間
  G :從保持空間取出內(nèi)容追加至模式空間
  x:  把模式空間中的內(nèi)容與保持空間中的內(nèi)容進(jìn)行互換
  n:  讀取匹配到的行的下一行 覆蓋 至模式空間
  N :讀取匹配到的行的下一行 追加 至模式空間
  d:  刪除模式空間中的行
  D :刪除 當(dāng)前模式空間開端至\n (換行)的內(nèi)容( 不再傳 至標(biāo)準(zhǔn)輸出),放棄之后的命令,
      但是對剩余模式空間重新執(zhí)行sed

三:sed練習(xí)

1 、刪除centos7 系統(tǒng)/etc/grub2.cfg 文件中所有以空白開頭的行行首的空白字符

  sed 's/^[[:space:]]\+//' /etc/grub2.cfg

2 、刪除/etc/fstab 文件中所有以# 開頭,后面至少跟一個(gè)空白字符的行的行首的# 和空白字符

  sed 's/^#[[:space:]]\+//' /etc/fstab

3 、在centos6 系統(tǒng)/root/install.log 每一行行首增加#號

  sed 's/^/#/g' /root/install.log

4 、在/etc/fstab 文件中不以# 開頭的行的行首增加#號

   sed 's/^[^#]/#/g' /etc/fstab

5 、處理/etc/fstab 路徑, 使用sed 命令取出其目錄名和基名

  取目錄名echo "/etc/sysconfig/network"|sed -r 's@(^/.*/)([^/]+/?)@\1@'
  取基名:echo "/etc/sysconfig/network"|sed -r 's@(^/.*/)([^/]+/?)@\2@'

6 、利用sed 取出ifconfig 命令中本機(jī)的IPv4 地址

  ifconfig eth0|sed -n '2p' |sed -e 's/^.*r://' -e 's/ .*//'  

7 、統(tǒng)計(jì)centos 安裝光盤中Package 目錄下的所有rpm 文件的以. 分隔倒數(shù)第二個(gè)字段的重復(fù)次數(shù)

  法一:  ll /misc/cd/Packages/ |egrep '*.rpm' | sed -r 's@(^.*\.) 
              ( [^.]+ )\.rpm$@\2@' | sort | uniq -c

法二:  ls /misc/cd/Packages/ |egrep '*.rpm$'|sed -e 's@.rpm@@' -e 's@.*\.@@'
       | sort |uniq -c

8 、統(tǒng)計(jì)/etc/init.d/functions 文件中每個(gè)單詞的出現(xiàn)次數(shù),并排序(用grep 和sed 兩種方法分別實(shí)現(xiàn))

sed -nre 's@[^[:alpha:]]+@\n@gp' /etc/init.d/functions |sort|uniq -c|sort -n
grep -oE '\<[[:alpha:]_]+[[:alnum:]]+\>' /etc/init.d/functions 

9 、將文本文件的n 和n+1 行合并為一行,n為奇數(shù)行

sed -n 'N;s/\n//p' /etc/passwd
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容