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 12:12
下一篇 2016-08-15 12:12

相關推薦

  • 命令的查看幫助 和 命令行的歷史

    命令的查看 分內部命令 和外部命令  查看外部命令 可用 man command–help info  查看內部命令 可用 help command man 幫助是 使用最頻繁的 命令查看 而 man 又有很多選項 如下    man – format and display the on-li…

    Linux干貨 2016-08-12
  • Linux基礎知識之壓縮、解壓、歸檔工具

    壓縮、解壓、歸檔工具     壓縮格式:gz,bz2,xz,zip,Z 壓縮算法不同,壓縮比也會不同     1.compress/uncompress (.Z) compress [-dfvcVr] [-b maxbits] [file …] -d: 解壓縮,相當于 -c: 結果輸出至標準輸出, 不刪除原…

    Linux干貨 2016-08-19
  • 進程管理

    簡述進程的相關理論與工具使用

    2017-09-09
  • 文件查找工具locate和find的使用分析

    文件查找工具locate和find的使用分析 不管是在windows系統中還是在Linux系統中,我們經常會一些文件進行搜索查找,而在Linux系統中經常用到的搜索工具有locate和find,這兩種搜索工具的工具原理和用法都不相同,一下將這對這兩種搜索工具的使用進行分析。 1、locate工具的工作原理是對/var/lib/mlocate/mlocat.d…

    Linux干貨 2016-08-18
  • N22-第六周作業

    1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; :%s@[[:space:]]\+@#&@g    2、復制/boot/grub/grub.conf至/tmp目錄中,刪除/tmp/grub.conf文件中的行首的空白字符; :%s#…

    Linux干貨 2016-09-26
  • 給linux系統添加新的磁盤

    虛擬化環境中,我們經常會遇到需要增加磁盤容量的情況,通常有兩種方式,第一種是添加一塊新的硬盤,另一種是擴容原有磁盤,以下是添加新磁盤至linux系統的操作規范。注:具體磁盤信息可能有所不同。 ##查看新增加磁盤/dev/sdb的信息 [root@CentOS7 ~]# fdisk -l /dev/sdb   Disk /dev/sdb: 5368 …

    Linux干貨 2016-11-11
欧美性久久久久