打开高效文本编辑之门_Linux sed之模式空间与保留空间
? ? ? ? ? ? ? ? ? ? ? ? ? ?Linux sed之模式空間保留空間使用案例
聲明與簡介
- sed:Stream Editor文本流編輯器,sed是一個“非交互式的”面向字符流的編輯器。本文主要結合數據以案例形式介紹怎樣使用保持空間、模式空間。比較形象的比喻:模式空間似加工區而保持區似倉庫區。
- 模式空間(pattern space): sed執行流程里比較常見的部分,它是存放、修改來自文件內容的sed緩存區。
- 保持空間(hold space):sed用來保持臨時數據的額外緩存區。我們可以在模式空間和保持空間內來回移動數據,但不能在保持空間里執行常見的命令。
- 對比:模式空間在sed的執行周期內自動清除,而保持空間則不會清除。
數據說明
如下是使用的示例文本?emp_2line.txt的數據,每個記錄對應2行,比如Tom的職位是ceo。
Tom ceo Jim manager Jack salesman Kate manager Luke developer Nancy tester Lily hr John tester模式空間與保持空間
awk里交換空間和模式空間的使用。
x命令
這里的x命令即Exchange是交換模式空間和保持空間的內容,它需要結合其它命令才彰顯威力。
x命令的簡單例子:如果第一行在模式空間,第二行在保持空間,你們通過x命令得到的效果是第一行是保持空間,第二行在模式空間。
交換模式空間與保持空間隔行匹配
# 打印職位是manager(經理)的員工名 sed -n -e 'x;n' -e '/manager/{x;p}' emp_2line.txt # 結果 Jim Kate # 原始數據(部分) Jim manager Jack salesman Kate manager # 過程詳解 # Step1: 'x;n',這里x是將模式空間交換到保持空間,n讀取模式空間的下一行。這時達到的效果是將當前行保存到保持空間,將下一行讀到模式空間內。(即實現了奇數行和偶數行的分離,員工職位讀取到模式空間、員工名稱讀取到保持空間)# Step2: '/manager/{x;p}' 如果模式空間里含有關鍵字manager,則將保持空間切換到模式空間,并打印出模式空間的內容(即員工職位)。# 形象版 1:這里x;n像一個繩一樣將原始文件相鄰的奇數和偶數行做了關聯,通過交換后奇數行在保持空間,偶數行在模式空間。以為sed的模式空間處理流程是一行一行的進行,處理完即清空。 # 2: 此時再通過模式空間里匹配關鍵字,那么對應保持空間里的內容在交換到模式空間。然后打印出來。#注: 1 這里加了-n,即只顯示受影響的行。#2 針對數據錯行的情況(即類似key和value分別對應兩行)h命令
h(hold縮寫)命令是拷貝模式空間到保持空間,它不會改變模式空間的內容,這與x命令是明顯不同的。而保持空間里的內容則會被模式空間里的覆蓋。
h命令的簡單例子:如果第一行在模式空間,第二行在保持空間,你們通過h命令得到的效果是保持空間為第一行,模式空間仍在第一行。
拷貝交換模式空間到保持空間
# 輸出職位是manager的員工的名稱(以拷貝方式) sed -n -e '/manager/!h' -e '/manager/{x;p}' emp_2line.txt # 結果 Jim Kate # 過程詳解 # Step1 ?如果模式空間里不包含關鍵字manager的內容拷貝到保持空間。換句話說這里是把員工名詞和員工職位不含manager的行拷貝到保持空間。 # Step2 如果模式里有能匹配到manager的則交換模式空間里的對應內容并打印出來。#注: 1 這里通過!(即反向匹配,不滿足條件)#2 這里沒有加N參數,而是走sed正常的執行流程。#3 其中Step1對應代碼'/manager/!h'、Step2對應代碼'/manager/{x;p}'。#4 個人理解'/manager/{x;p}'會產生一個匹配行上一行的鏈接。?
?
H命令
大寫的H命令是將模式空間在保持空間里追加新的行。也就是說保持空間之前的內容不會被覆蓋,而是追加。
H命令的簡單例子:如果第一行在模式空間,第二行在保持空間,你們通過H命令得到的效果是模式空間仍是第一行,保持空間變成“第二行\n第一行”,
追加模式空間到保持空間
#將匹配到manager的行的上下行都打印出來。 sed -n -e '/manager/!h' -e '/manager/{H;x;p}' emp_2line.txt # 執行結果 Jim manager Kate Manager # Step1 如果模式空間里不包含關鍵字manager的內容拷貝到保持空間。換句話說這里是把員工名詞和員工職位不含manager的行拷貝到保持空間。 # Step2 如果模式里有能匹配到manager,那么H命令會往保持空間里追新行。這里即將關鍵字含manager的員工名和員工職位追加到保持空間里。同樣的,這里的x是交換保持空間和模式空間里的內容,p則是打印出來。 #注:特別的,如果想把員工名和員工職位在一行打印出來,則需要結合字符串替換(將\n替換為空字符串)。 sed -n -e '/manager/!h' -e '/manager/{H;x;s/\n/,/;p}' emp_2line.txt #結果 Jim,manager Kate,managerg命令
拷貝保持空間到模式空間
g命令對應get即從保持空間拿回內容到模式空間。
g命令的簡單例子:如果第一行在模式空間,第二行在保持空間,你們通過h命令得到的效果是模式空間變成在第二行,保持空間仍是第二行,
# 打印員工的名稱 sed -n -e '/manager/!h' -e '/manager/{g;p}' emp_2line.txt # 結果 Jim Kate #過程詳解: # Step1 如果模式空間里不包含關鍵字manager的內容拷貝到保持空間。換句話說這里是把員工名詞和員工職位不含manager的行拷貝到保持空間。 # Step2 從保持空間里拿出內容到模式空間然后再打印出來。G命令
追加保持空間到模式空間
大寫的G命令是將保持空間里模式空間追加新的行。也就是說模式空間之前的內容不會被覆蓋,而是追加。
G命令的簡單例子:如果第一行在模式空間,第二行在保持空間,你們通過G命令得到的效果是模式空間變成在”第一行\n第二行”,保持空間仍是第二行,
# 打印員工名稱和職位,以逗號分割”;“ sed -n -e '/manager/!h' -e '/manager/{x;G;s/\n/,/;p'} emp_2line.txt #結果 Jim,manager Kate,manager #過程詳解 # Step1 如果模式空間里不包含關鍵字manager的內容拷貝到保持空間。換句話說這里是把員工名詞和員工職位不含manager的行拷貝到保持空間。 # Step2 這里x是交換保持空間和模式空間的內容,結果是員工名在模式空間,員工職位在保持空間。G命令是將保持空間的內容(匹配到關鍵字manager)追加到模式空間,所以結果是員工名稱\n員工職位。s則是將換行替換為了逗號”,”。 注: 如果打印時員工名稱和職位互換位置,則需要僅寫G在。 sed -n -e '/manager/!h' -e '/manager/{G;s/\n/,/;p'} emp_2line.txt #結果 manager,Jim manager,Kate?
總結
以上是生活随笔為你收集整理的打开高效文本编辑之门_Linux sed之模式空间与保留空间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 肉末豆腐的家常做法?
- 下一篇: 打开高效文本编辑之门_Linux sed