linux模式匹配,sed的模式匹配用法探討

[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的使用方法,歡迎大家和我一起交流探討,共同進步。

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257383.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257383.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257383.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Qualcomm QXDM工具簡介和log抓取

高通工具簡介QXDM 簡介QXDM 安裝QXDM 激活QXDM 使用AT打開Diagnostic口 QXDM 配置1 Message View ConfigurationMessage PacketsLog PacketsLog PacketsOTAEvent ReportsStrings2 Log View Config3 QXDM-保存配置文件4 QXDM-導入配置文件QPST 端口配置QXDM 抓取log QXDM LOG保存…

layout_gravity

layout_gravity——當前View,本身,在父一級的控件所分配的顯示范圍內的,對齊方式常用在: 當前控件(在父一級LineLayout所分配給其的顯示范圍內)的對齊方式需要注意的是,如果TableRow的gravity確…

Linux_arm_啟動_c語言部分詳解,[原創]Linux arm 啟動 c語言部分詳解第四講

Linux arm啟動c語言部分詳解第四講(from setup_per_cpu_areas();)Written by leeming上面的setup_arch花了我們大量的篇幅,現在我們要繼續往前推進了。注:黑色為主線,藍色為函數的一級展開,紅色是注意重要的地方。//因為我們沒有定…

Kudu1.1.0 、 Kudu1.2.0 Kudu1.3.0的版本信息異同比較

不多說,直接上干貨! Kudu1.1.0 新特性 python API升級,具備JAVA Cclient一樣的功能(從0.3版本直接升級到1.1),主要的點如下: 1.1. 改進了Parial Row的語義 1.2. 增加了range partition支持 1.3.…

ASP.NET Web API 中 特性路由(Attribute Routing) 的重名問題

剛才忘了說了,在控制器名重名的情況下,特性路由是不生效的。不然的話就可以利用特性路由解決同名的問題了。 而且這種不生效是真的不生效,不會提示任何錯誤,重名或者什么的,直接會報告404,所以也是個坑。轉…

Python3爬取網頁信息亂碼怎么解決?(更新:已解決)

更新:亂碼問題已經解決了。 將下面代碼中的紅色部分改為下面這樣就不會出現個別職位信息亂碼的情況了。 soup2 BeautifulSoup(wbdata2, html.parser,from_encoding"GBK") 另外: 建立了一個微信公眾號,主要分享軟件視頻教程、文檔筆…

洗衣機洗滌部分c語言程序,51單片機洗衣機控制板及C語言程序

51單片機洗衣機控制板及C語言程序,該控制板單片機采用AT89C51單片機,所設計全自動洗衣機功能有:標準洗衣、經濟洗衣、單獨洗衣以及排水四種洗衣等四種方式,有強洗、弱洗及運行/暫停、顯示及報警功能,程序利用利用Protues仿真軟件觀…

數據存儲

一、NSCoding &#xff1a; 使用NSCoding需要遵守<NSCoding> 保存&#xff1a; /** * 將某個對象寫入文件時會調用 * 在這個方法中說清楚哪些屬性需要存儲 */ MJStudent.m - (void)encodeWithCoder:(NSCoder *)encoder { [encoder encodeObject:self.no forKey:"…

犯人釋放的C語言程序,C語言的自動關機程序和一個用來整人的小程序

可以用C語言中的system()函數來實現系統的自動關機程序&#xff0c;可以設置多長時間后將自動關機。當然馬上關機也是可以的&#xff0c;我們就可以惡搞別人計算機了(你事先得知道怎么解)&#xff0c;將寫好的自動關機程序復制到別人電腦&#xff0c;然后將可執行的文件設為開機…

[mysql] linux下使用yum安裝mysql

From: http://www.2cto.com/database/201207/141878.html linux下使用yum安裝mysql1、安裝查看有沒有安裝過&#xff1a;yum list installed mysql*rpm -qa | grep mysql*查看有沒有安裝包&#xff1a;yum list mysql*安裝mysql客戶端&#xff1a;yum install mysql安裝mysql 服…

圖解MapReduceMapReduce整體流程圖

1.圖解MapReduceMapReduce整體流程圖 并行讀取文本中的內容&#xff0c;然后進行MapReduce操作 Map過程&#xff1a;并行讀取三行&#xff0c;對讀取的單詞進行map操作&#xff0c;每個詞都以<key,value>形式生成 reduce操作是對map的結果進行排序&#xff0c;合并&#…

阿里云推出CloudDBA,解決數據庫性能優化和問題診斷難題

問題診斷(trouble shooting) 和 性能優化(performance tunning) 一直都是數據庫領域的專業問題&#xff0c;需要資深DBA的專業技能才能勝任解決&#xff0c;但這樣的人才是稀缺的&#xff0c;無法及時滿足大部分的企業緊急需求。如果有一款產品能夠在大多數情況下&#xff0c;用…

c語言程序設計學生信息管理系統代碼,c語言程序設計學生成績管理系統源代碼.pdf...

c語言程序設計 學 生 成 績 管 理 系 統 源代碼#include#include#include#include#define MAX 80int a;typedef struct /*定義結構體數組*/{ char num[10];char name[20];int score;} Student;Student stu[MAX];int menu_select(){char c;do{system("cls");/*清屏*/p…

初探ArrayList之刪除

1.返回刪除元素的刪除方法 public E remove(int index) {rangeCheck(index);modCount;//記錄修改次數的變量E oldValue elementData(index);//根據數組下標拿到指定元素int numMoved size - index - 1;//計算移動位數if (numMoved > 0)System.arraycopy(elementData, inde…

UESTC_秋實大哥與花 2015 UESTC Training for Data StructuresProblem B

B - 秋實大哥與花 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Status秋實大哥是一個儒雅之人&#xff0c;晝聽笙歌夜醉眠&#xff0c;若非月下即花前。 所以秋實大哥精心照料了很多花朵。現在所有的花朵排成了一行&#xff…

java的三大特性,封裝,繼承,多態

封裝 Java代碼 /** * 所謂封裝&#xff0c;就是將對象具有的成員變量和成員函數包裝和隱藏起來&#xff0c;讓外界無法直接使用&#xff0c; * 被封裝的成員只能通過某些特定的方式才能訪問。 * 實現封裝有兩個步驟&#xff1a; * 1、將不能暴露的成員隱藏起來&#x…

銀行家算法實驗報告c語言版,銀行家算法實驗報告C語言版.doc

《操作系統》課程綜合性實驗報告姓名&#xff1a; 學號&#xff1a; 2016 年 11 月 20 日實驗題目進程調度算法程序設計一、實驗目的通過對安全性算法和銀行家算法的模擬&#xff0c;進一步理解資源分配的基本概念&#xff0c;加深對資源申請&#xff0c;資源分配(銀行家算法)以…

GetModuleHandle(NULL)獲取當前DLL模塊基址?

做一項目想在DLL內部代碼實現獲取本DLL的模塊基址&#xff0c;而且不知道本DLL名稱 最簡單的方法是想到GetModuleHandle(NULL)&#xff0c;是否可以呢? 參看http://blog.csdn.net/guzhou_diaoke/article/details/8826558到的答案是否 自己嘗試了一下: DLL代碼(testDll): BOOL …

DataTable是否存在某個列的判斷

使用 DataTable.Columns.Contains方法可以判斷某個列名是否存在于某個DataTable中 //添加模擬數據 DataTable t new DataTable(); DataColumn col new DataColumn("aaa"); t.Columns.Add(col); col new DataColumn("bbb"); t.Columns.Add(col); col ne…

【評分】第三次作業-團隊展示

【評分】第三次作業-團隊展示 總結 【2017-10-10】更新&#xff1a; 分數映射至 [1,2] 分 【注意】&#xff1a; 為了保護大家隱私&#xff0c;以后發表博客&#xff1a; 涉及到學號時&#xff0c;僅提供后三位涉及到姓名時&#xff0c;僅提供名&#xff08;省略姓&#xff09;…