sed的模式匹配用法探討

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://nolinux.blog.51cto.com/4824967/1405753

[root@sunsky Desktop]# cat sunsky
a
b
c
d
e
f
[root@sunsky Desktop]# cat sunsky|sed '1,2d'|sed '1,2d'
e
f
[root@sunsky Desktop]# cat sunsky|sed -e '1,2d' -e '1,2d'
d
e
f

問題:

sed中-e的意思是直接在指令列模式上進行sed的動作編輯按照,那么按照-e的含義,上下兩組命令的執行結果應該相同,但是為什么結果不一樣呢?


解答:

下面先把兩組命令的執行過程列出來給大家看!

第一組命令:

cat sunsky   # 輸出了sunsky文本中a-f這6個字母

a

b

c

d

e

f

sed '1,2d'

     第一個命令的標準輸出變成了第二條命令的標準輸入,即cat sunsky輸出的a,b,c,d,e,f.在第二條命令執行之后,第一條命令產生的數據流的1,2行刪除掉,即刪除了a和b,然后輸出剩余的行,即c,d,e,f,結果如下:

c

d

e

f

sed '1,2d'

     第二個命令的標準輸出變成了第三個命令的標準輸入,即c,d,e,f,由于對于第三條命令來講是新的數據流,因此該數據流有新的行號定義,即第一行是字母c,第二行是字母d,第三行是字母e,第四行是字母f.此時,最后一條命令即第三條命令sed '1,2d'會把當前數據流的1,2行刪掉,即刪除了c和d這兩個字母,然后輸出剩余的行,即e,f,結果如下:

e

f



第二組命令:

cat sunsky   # 輸出了sunsky文本中a-f這6個字母

a

b

c

d

e

f

sed -e '1,2d' -e '1,2d'

     該命令會對管道輸入的數據流,即a,b,c,d,e,f進行行號定義,即第一行是字母a,第二行是字母b,第三行是字母c直到最后一行字母f。然后執行它的模式操作。在執行模式操作時,由于使用了兩個-e,因此會拆分成2步執行,第一步先執行第一個-e '1,2d',第二步執行第二個-e '1,2d'。那么具體執行過程如下:

     第一個-e '1,2d'  #它會將1,2行的數據刪除,即刪除了字母a和字母b

     第二個-e '1,2d'  #由于此時剩下的數據為第三行的字母c到最后一行的字母f,此時它去匹配第一行到第二行,顯然是匹配不成功的,因為第一行和第二行已經在前一個模式操作時被刪掉了。那么此時怎么辦呢?

     這個就要涉及到模式匹配操作了,由于sed的點到點匹配常用的有4種,詳解如下:

一)line1,line2    純行號匹配,第幾行到第幾行之間的內容,如果是前面行號匹配不到(過小則默認為當前最小的行號,過大則前后模式匹配操作都放棄),如果是后面行號匹配不到(過小則后面行號匹配操作放棄,僅前面行號匹配操作生效,過大則默認匹配到行尾)

二)/pattern/,/pattern/    純模式匹配,第一個匹配到的模式到最后一個匹配到的模式之間的內容,如果是前面匹配模式匹配不到則前后模式匹配操作都放棄,如果是后面模式匹配匹配不到,就默認到匹配到行尾

三)/pattern/,line    第一個匹配到的模式到指定的行號之間的內容,如果是前面模式匹配匹配不到則前后模式匹配操作都放棄,如果是后面行號匹配不到(過小則后面行號匹配操作放棄,僅前面模式匹配操作生效,過大則默認匹配到行尾)

四)line,/pattern/    指定的行號到第一個匹配到的模式之間的內容,如果前面行號匹配不到(過小,就默認為當前最小的行號,過大則前后模式匹配操作都放棄),如果后面模式匹配匹配不到,就默認匹配到行尾

     因此,按照上面的四種模式匹配的解釋,我們這里進行分析

     由于經歷了第一個-e '1,2d'的操作,第一行和第二行數據已經讓刪除了,此時僅剩下第三行到最后一行的數據,即c,d,e,f,此時最小行號是第三行。第二個-e '1,2d'操作,該匹配操作很明顯是屬于純行號匹配,由于第一行已經沒有了,現在最小行是第三行,前面的行號1匹配過小,在純行號匹配模式下,前面行號匹配過小,則默認為當前最小行號,即第三行。這樣子,前面的行號匹配就成功了,接下來進行后面的行號匹配,由于行號2已經在第一個-e '1,2d'的操作中被刪除了,因此在純行號匹配模式下,后面行號匹配過小,則僅前面行號匹配操作生效。因此第二個-e '1,2d'操作的結果就是僅匹配到了第三行的字母c,然后根據操作指令d,將其刪除,得到結果如下:

d

e

f


     以上就是cat sunsky|sed '1,2d'|sed '1,2d'和cat sunsky|sed -e '1,2d' -e '1,2d'這兩組命令執行的不同之處,當然也是該問題的解答。

     希望大家能明白,關于sed和awk的使用方法,歡迎大家和我一起交流探討,共同進步。

轉自:http://nolinux.blog.51cto.com/4824967/1405753

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

(0)
s19930811s19930811
上一篇 2016-08-15
下一篇 2016-08-15

相關推薦

  • httpd服務歸納:httpd簡介與基本安裝

    一、httpd 簡介  1. httpd 歷史: httpd daemon 最早誕生于1995年二月, 伊利諾伊大學香檳分校的美國國家超級計算應用中心(NCSA),由Rob McCool開發。當這個項目完成后,Rob 老兄離開RCSA以后,這個項目組就解散了,這個項目也隨之終止。 但是,由Brian Behlendorf 和 Cliff …

    Linux干貨 2015-05-07
  • 二.Linux博客-2016年7月21日screen、echo

    格式說明: 操作 概念 命令 說明及舉例 二.screen、echo internet 因特網ethernet 以太網ctrl+alt+F1 圖形界面ctrl+alt+F2-F6 字符界面 命令:who am i/who/who me i/tty/df/ifconfig/w/ halt 關機 reboot&n…

    Linux干貨 2016-08-24
  • 文件權限

    文件權限 文件屬性       rw-r–r–表示文件權限     Root 表示文件所有者     Root 表示文件所屬組     0 表示文件的大小 …

    Linux干貨 2016-08-11
  • GNU awk

    GNU awk:      文本處理三劍客:grep,sed,awk            grep,egrep,fgrep:文本過濾工具;pattern     &nb…

    Linux干貨 2017-05-22
  • linux基礎學習第十天(文件查找與壓縮)

    2016-08-12 授課內容: shell的流程控制 文件查找和壓縮 shell的流程控制: 過程式編程語言: 順序執行 選擇執行 循環執行(未講) 順序執行: if語句: 單分支 if 判斷條件; then 條件為真的分支代碼 fi 雙分支 if 判斷條件; then 條件為真的分支代碼 else 條件為假的分支代碼 fi 多分支 if CONDITIO…

    Linux干貨 2016-08-15
  • 文本處理-三劍客-awk

    報告生成器,格式化文本輸出
    awk [options] ‘BEGIN{ action;… } pattern{ action;… } END{ action;… }’ file …

    2018-03-16
欧美性久久久久