原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。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