sed工具實踐解析

此次博文介紹一下文本處理三劍客中的sed工具(點擊查看grep工具http://www.www58058.com/83512

介紹sed

sed是非交互式的編輯器。它不會修改文件,除非使用shell重定向來保存結果。默認情況下,所有的輸出行都被打印到屏幕上。

運行過程:

sed編輯器逐行處理文件,并將結果發送到屏幕。具體過程如下:首先sed把當前正在處理的行保存在一個臨時緩存區中(也稱為模式空間),然后處理模式空間中的行,完成后把該行打印到屏幕上。sed每處理完一行就將其從模式空間刪除,然后將下一行讀入,進行處理和顯示。處理完輸入文件的最后一行后,sed便結束運行。sed把每一行都存在模式空間中,對這個緩存副本進行編輯,所以不會修改原文件。如果沒有對行處理的話,直接把行打印到屏幕上。

sed工具的使用

1)地址定界:

既然是對文件逐行處理,首先我們決定對哪些行進行編輯,即地址定界,如果沒有指定地址,sed將處理輸入文件的所有行,地址的形式可以是數字、正則表達式、或二者的結合以及其他可以表示指定行的語句。

<1>不指定地址:對全文進行處理

[root@localhost app]#sed -n 'p' test1    
1 one
2 ttwo
3 three
4 fffour
5 ffffive

<2>單地址:

#: 指定的行 或  /pattern/:被此處模式(基本正則表達式)所能夠匹配到的每一行

[root@localhost app]#cat test1                         #假定一個實驗文件
1 one
2 ttwo
3 three
4 fffour
5 ffffive
[root@localhost app]#sed -n '2p' test1                 #對指定行處理
2 ttwo
[root@localhost app]#sed -n '/\b[a-z]\{4\}\b/p' test1  #支持模式匹配
2 ttwo

<3>范圍地址:

#,# 或 #,+# 或 /pat1/,/pat2/ 或 #,/pat1/

[root@localhost app]#sed -n '2,4p' test1                #第2行到第4hang
2 ttwo
3 three
4 fffour
[root@localhost app]#sed -n '2,+2p' test1               #第2行到第2+2行
......
[root@localhost app]#sed -n '/\b[a-z]\{4\}\b/,/\b[a-z]\{6\}\b/p' test1    #模式匹配行1到模式匹配行2
......
[root@localhost app]#sed -n '2,/\b[a-z]\{6\}\b/p' test1                   #第2行到模式匹配行
......

其他:

1~2 奇數行 或 2~2 偶數行

[root@localhost app]#sed -n '1~2p' test1                
1 one
3 three
5 ffffive
[root@localhost app]#sed -n '2~2p' test1  
2 ttwo
4 fffour

2sed用法:

sed [option]… ‘script’ inputfile…

<1>sed選項:

-n –quiet, –silent 取消默認自動打印模式空間的行

-e script –expression=script添加“腳本”到程序的運行列表,可以實現多點編輯

-f 腳本文件 :–file=腳本文件添加“腳本文件”到程序的運行列表,換行鍵入命令可以實現多點編輯

-r –regexp-extended 支持使用擴展正則表達式

-i.[擴展名] –in-place[=擴展名] 直接修改文件(如果指定擴展名就備份文件)

-s –separate 將輸入文件視為各個獨立的文件而不是一個長的連續輸入,可以指定多個文件

[root@localhost app]#sed "2p" test1                #默認打印模式空間
1 one
2 ttwo
2 ttwo
3 three
4 fffour
5 ffffive
[root@localhost app]#sed -n "2p" test1             #取消默認打印模式空間
2 ttwo
[root@localhost app]#sed -e '2p' -e '3d' test1     #-e 多點編輯
1 one
2 ttwo
2 ttwo
4 fffour
5 ffffive
[root@localhost app]#cat test2
2p
3d
[root@localhost app]#sed -f test2 test1             # -f 添加文件編輯(文件內換行可以進行多點編輯)
1 one
2 ttwo
2 ttwo
4 fffour
5 ffffive
[root@localhost app]#sed -rn '2,/\b[a-z]{6}\b/p' test1  #-r 支持擴展正則表達式
......
[root@localhost app]#sed -sn '2p' passwd shadow    #-s 指定多個文件 bin:x:1:1:bin:/bin:/sbin/nologin
bin:*:17400:0:99999:7:::
[root@localhost app]#sed -i '2p' test1          #-i 直接對原文件編輯  
[root@localhost app]#sed -i.bak '2p' test1     #將原文件備份,直接編輯原文件

<2>sed命令:

sed命令告訴sed如何處理由地址定界指定的輸入行

刪除模式空間匹配的行 a [\]text 在指定行后面追加文本支持使用\n實現多行追加
q 結束或者退出sed i [\]text 在行前面插入文本
c [\]text 替換行為單行或多行文本 c [\]text 替換行為單行或多行文本
w /path/somefile 保存模式匹配的行至指定文件 r /path/somefile 讀取指定文件的文本至模式空間中匹配到的行后
為模式空間中的行打印行號 模式空間中匹配行取反處理

[root@localhost app]#sed '2q' test1                 #到第二行退出sed
1 one
2 ttwo
[root@localhost app]#sed '2chello' test1            #將第二行替換為hello
1 one
hello
3 three
4 fffour
5 ffffive 
[root@localhost app]#sed '2ahello' test1            #在第二行后面添加一行hello
1 one
2 ttwo
hello
3 three
4 fffour
5 ffffive 
[root@localhost app]#sed '2a\                       #反斜杠\ 支持多行輸入
> hello\
> nihao
> ' test1
1 one
2 ttwo
hello
nihao
3 three
4 fffour
5 ffffive
[root@localhost app]#sed '2ihello' test1            #在第二行前面添加一行hello
1 one
hello
2 ttwo
3 three
4 fffour
5 ffffive
[root@localhost app]#sed '2w /app/test2' test1      #將匹配到的第二行保存至文件
1 one
2 ttwo
3 three
4 fffour
5 ffffive
[root@localhost app]#cat test2
2 ttwo
[root@localhost app]#sed '3r /app/test2' test1      #將文件內容添加到匹配到的行后面
1 one
2 ttwo
3 three
2 ttwo
4 fffour
5 ffffive
[root@localhost app]#sed '=' test1                  #在每一行的上面另起一行顯示行號
1
1 one
2
2 ttwo
3
3 three
4
4 fffour
5
5 ffffive
[root@localhost app]#sed '2!=' test1                #取反編輯,除了匹配到的行,對其余行進行處理
1
1 one
2 ttwo
3
3 three
4
4 fffour
5
5 ffffive

s/// : 查找替換,默認替換第一個被匹配到的字符串,支持使用其它分隔符,s@@@,s###

替換標記:g :行內全局替換  p :顯示替換成功的行 w :/PATH/TO/SOMEFILE : 將替換成功的行保存至文件中

[root@localhost app]#sed 's/[a-z]/#/' test1       #默認替換匹配行所匹配到的第一個字符串
1 #ne
2 #two
3 #hree
4 #ffour
5 #fffive
[root@localhost app]#sed 's/[a-z]/#/g' test1      #-g 匹配行內全局替換
1 ###
2 ####
3 #####
4 ######
5 #######
[root@localhost app]#sed -n 's/[a-z]/#/p' test1   #-p 顯示替換成功的行
1 #ne
2 #two
3 #hree
4 #ffour
5 #fffive
[root@localhost app]#sed -n 's/[a-z]/#/w /app/test2' test1    #將替換成功的行保存至文件
[root@localhost app]#cat test2
1 #ne
2 #two
3 #hree
4 #ffour
5 #fffive

注意:當匹配模式中含有與分隔符相同的符號時,應當換一種分隔符。,避免匹配模式中出現與分隔符相同的符號

比如:

[root@localhost app]#cat test3
123
4/6
7/9
[root@localhost app]#sed '2s///5/' test3      #分隔符與匹配模式相同容易出錯
sed: -e expression #1, char 7: unknown option to `s'
[root@localhost app]#sed '2s@/@5@' test3      #換一種分隔符
123
456
7/9

高級編輯命令:

學習之前要了解到模式空間和保持空間,除了sed把當前正在處理的行保存在一個臨時緩存區中的這個模式空間以外,還有一個保持空間(緩沖區、保留空間),默認為空行

h : 把模式空間中的內容覆蓋至保持空間中

H : 把模式空間中的內容追加至保持空間中

g : 從保持空間取出數據覆蓋至模式空間

G : 從保持空間取出內容追加至模式空間

: 把模式空間中的內容與保持空間中的內容進行互換

n : 讀取匹配到的行的下一行覆蓋至模式空間

N : 讀取匹配到的行的下一行追加至模式空間

: 刪除模式空間中的行

D : 刪除當前模式空間開端至\n的內容(不再傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed

通過具體的例子來學習sed高級編輯命令:

[root@localhost app]#sed 'h;G' test1    
 #先處理h,把匹配到的行(逐行)覆蓋到保持空間,然后G,將保持空間的數據追加到模式空間,最后打印顯示,這里是默認全部行
1 one
1 one
2 ttwo
2 ttwo
3 three
3 three
4 fffour
4 fffour
5 ffffive
5 ffffive
[root@localhost app]#sed '/one/h;/ttwo/x' test1   
#首先處理h,將匹配到的行(one)覆蓋至保持空間,然后處理x,將模式空間中匹配到的行(ttwo)與保持空間的數據互換,最后打印顯示
1 one
1 one
3 three
4 fffour
5 ffffive
[root@localhost app]#sed 'n;d' test1 
#先手處理n,將匹配到的行(逐行)的下一行覆蓋至模式空間,然后處理d,將匹配到的模式空間的行刪除,最后打印顯示
1 one 3 three 5 ffffive
[root@localhost app]#sed 'N;D;d' test1 
#先手處理N,將匹配到行(逐行)追加到模式空間,然后處理D,刪除模式空間開頭至\n換行的數據,并且不執行后面的命令(;d),同時不打印顯示并重新循環執行sed直至最后
5 ffffive

文本處理三劍客(grep,sed,awk)單獨任何一個都足以寫成一本書,此次介紹如有不足之處,敬請批評指出



原創文章,作者:Mozart,如若轉載,請注明出處:http://www.www58058.com/85364

(0)
MozartMozart
上一篇 2017-08-26 17:50
下一篇 2017-08-26 19:23

相關推薦

  • linux啟動流程+任務計劃

    20160907 一、作業 1、每周2, 4, 7備份/var/log/messages文件至/logs目錄中,文件名形如“messages-yyyymmdd” 2、每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的信息追加至/tmp/meminfo.txt文件中 二、博客 1、centos5,6啟動流程 開機——POST…

    Linux干貨 2016-09-08
  • iptables之froward

    先克隆一臺centos服務器添加虛擬網卡 同時兩個服務器配上host only的網卡 echo 1 > /proc/sys/net/ipv4/ip_forward打開網卡間轉發 有回包 但是沒有10.0.0.3還是沒有ping通原因是192.168.68.134 的網關指向了192.168.68.2 而不是192.168.68.144添加一條指向192…

    2017-11-12
  • 關于touch/>/>>創建同名文件的總結

    一、簡介 1、touch     即創建文件或修改文件時間     語法:touch [options] file-list 2、>     創建文件,可直接把內容生成到指定文件,會覆蓋源文件中的內容;也可以直接生成一個空白文件。     語法:> file…

    2017-02-18
  • Linux風水學

    Linux風水學童 有的沒的說一說 說一個,到一個。想起哪個說哪個,說起哪個都不錯。 對于接觸過一點點Linux的風水學童的我來說,還在苦背天地玄黃,宇宙洪荒。雖然不懂是干什么的,但是心里總有個聲音告訴我,這些鬼畫符肯定有用。總有一天我能成為一個合格的Linux風水師,去某個員外家里施展堪輿之術被奉為上賓。 Linux流派大概   相對于目前的流派…

    2017-07-18
  • Linux之旅1

    Linux之旅1  一、描述計算機的組成及其功能 計算機的組成: 1、計算機主要由:CPU(控制器、運算器)、存儲器、輸入設備、和輸出設備(輸入設備、和輸出設備又稱為I/O設備)四部分組成; 計算機個組成部分的功能: CPU:主要有控制器和運算器組成; 控制器:控制器是整個計算機的中樞神經;其功能是對程序規定的控制信息進行解釋,根據其要求進行控制,…

    2016-09-12
  • linux 啟動文件 /etc/fstab 文件刪除 無法開機 修復的方法

    /etc/fstab文件刪除系統自檢無法掛載 無法啟動 按照提示進入命令行  手動寫/etc/fstab,如無內核文件  無grub  就缺啥補啥 fdisk    -l 查看當前分區  blkid    查看分區文件系統的卷標 手動掛載 …

    Linux干貨 2016-09-13
欧美性久久久久