sed工作機制中另一個邏輯空間用于作為模式空間的好幫手,就是叫保持空間(hold space),在模式空間中處理一行內容會繼續處理下一行,那么對于處理過的行可能還有其他處理,因此可以先把處理好的數據存放在hold space 中,然后等到全部處理好之后在回到模式空間中。簡單的可以說是用于和模式空間配合使用交換空間里的數據達到想要的結果
其中一般用到hold space的稱作高級編輯命令:
高級編輯命令:
h:把模式空間中的內容覆蓋至保持空間中 H:把模式空間中的內容追加至保持空間中 g:把保持空間中的內容覆蓋至模式空間中 G:把保持空間中的內容追加至模式空間中 n:覆蓋讀取匹配到的行的下一行至模式空間中 N:追加讀取匹配到的行的下一行至模式空間中 d:刪除模式空間中的行 D:刪除多行模式空間中的首行 x:把模式空間中的內容與保持空間中的內容替換
高級命令示例解析:
1.sed -n ‘n;p‘ file 顯示文件中偶數行(即2、4、6、8……行)
-n:不打印默認打印到屏幕上的所有行(靜默模式)
n:覆蓋讀取匹配到的行的下一行至模式空間中
p:打印符合pattern psace的行
[root@localhost ~]# cat SED.txt | tr -d '\n' 12345678910 //這里我把換行刪除為節約空間便于觀察 [root@localhost ~]# sed -n 'n;p' SED.txt 2 4 6 8 10
解析:
當sed讀取文件中的第一行,來到執行“n”命令,而“n”命令的作用是讀取匹配到的下一行到模式空間,也就是說我們現在模式空間中的是第一行,而“n”命令需要我們去讀它的下一行,也就是把第二行讀到模式空間,把第一行覆蓋了,而后又執行“p”命令,則是打印出pattern space 中的行,即打印第2行,由于我們使用“ -n ” 選項默認不打印pattern space 讀過的內容,而“p”命令是打印pattern space 符合條件的,所以打印第二行;
接著讀取第三行,因為第二行在讀取第一行的時候已經被命令調用去讀取第二行。so讀取第三行,然后執行“n”命令,又去讀取第4行,從而覆蓋掉了第三行,然后打印第4行;………sed命令就這么一直執行下去,符合條件輸出的都是雙數行 。輸出的也就是偶數行
2.sed ’1!G;h;$!d' file 逆序顯示文件
G:把保持空間中的內容追加至模式空間中 h:把模式空間中的內容覆蓋至保持空間中 d:刪除行 $: 最后一行 ?。喝》? (1!G):除了第一行,其他都要執行G命令 ($!d):除了最后一行,其他都有要執行“d”(刪除)命令 [root@localhost ~]# sed '1!G;h;$!d' SED.txt 10 9 8 7 6 5 4 3 2 1
解析:
讀取文件第一行,判斷是不是第一行,如果是就不執行G命令,如果不是,就執行G命令,現在讀取的是第一行,所以不執行G命令,然后來到執行第二個命令(h),現在模式空間中的是第一行,則把第一行復制覆蓋到保持空間中,然后在執行下一個命令,判斷模式空間中的是不是最后一行,如果是,就不刪除,否則刪除,現在模式空間中的是第一行,所以刪除,保持空間中的內容不變;
接著讀取第二行,判斷出不是第一行,則執行“G”命令,把保持空間中原有的第一行追加讀取到模式空間中(現在模式空間中的順序為2在前1在后,因為是追加上去的),然后執行“h”命令,把模式空間中的行復制覆蓋到保持空間中,因此現在保持空間中的順序為第二行在前,第一行在后,然后判斷是否為最后一行時,模式空間中的第二行和第一行則被刪除掉;
再接著讀取第三行,在依次進行判斷,得到最后的結果就是倒序顯示文件中的行。(繞了那么多,其實就是tac命令解決,這只是為了理解其含義)
3.sed '$!d' file 取出文件最后一行
$:最后一行 d:刪除行 [root@localhost ~]# sed '$!d' SED.txt 10
解析:
讀取第一行到模式空間中,第一個命令判斷是否為最后一行,如果是,則不刪除,否則刪除,由此可知,只有最后一行不刪除,其他全刪除,就留下最后一行。則取出文件最后一行。
4.sed ‘$!N;$!D' file 取出文件 最后兩行2
N:追加讀取匹配到的行的下一行至模式空間中 D:刪除多行模式空間中的首行 $:最后一行 [root@localhost ~]# sed '$!N;$!D' SED.txt 9 10
解析:
讀取第一行,然后執行第一個命令,(如果不是最后一行則追加讀取匹配到的當前行的下一行到模式空間中,)此時是第一行,然后執行"N"命令,把當前行的下一行追加讀取到當前的模式空間中,此時模式空間中為12兩行,然后再執行后面的命令(如果不是最后一行,則刪除當前多行中的首行,即刪除第一行,)此時模式空間中還剩下第二行(暫時保存在保持空間中,雖然沒有命令說要將行放到保持空間中,保持空間如果沒有命令指定用,則會用來保存模式空間處理過的行,以便模式空間之后需要使用);
則又去讀取第三行,然后判斷不是最后一行, 則追加當前的第三行的下一行(第四行)到模式空間中,(此時模式空間中加上原有剩下的第二行,為2和4行,)然后再判斷不是最后一行,則刪除當前模式空間中的第一行,留下第四行。
則繼續讀取第五行,此時為最后一行,然后第一個命令不執行“N”命令,再接著不執行D命令,即現在模式空間中的所剩下的行為第4行和第5行,然后打印模式空間的行出來即為文件的最后兩行。
5.sed ‘/^$/d;G file 刪除原文件中的空白行,再添加空行到每一行的下面
這比較簡單,大伙試著自己分析吧,只要把高級命令各個所代表含義記熟這都不是事。(我也留幾個以后看的忘了好繼續分析理解)
6.sed ’n;d' file 顯示奇數行
這和第一題恰好相反
7.sed 'G' file 在原文件中的每一行添加空行,包括原有的空白行后面也添加空白行
這更不用解釋了
加油,付出就一定會有收獲的!??!
原創文章,作者:Lii,如若轉載,請注明出處:http://www.www58058.com/31816