- 前言
sed
有兩個(gè)內(nèi)置的存儲空間:一是 “模式空間”天试,二是 “保持空間”氛什,這篇主要講解 “模式空間”朴上,你可能會問為啥不講 “保持空間” 哪秦踪?那是因?yàn)槲以谀壳暗墓ぷ骱蛯W(xué)習(xí)中沒有遇到 “保持空間” 的案例机错,我也找不到什么合適的例子爬范,那就等遇到再學(xué)嘍!故本文就重點(diǎn)介紹應(yīng)用于sed
“模式空間” 的兩個(gè)命令N
和n
模式空間的概念
模式空間:sed
工具從文件讀取一行文本然后存入的緩沖區(qū)弱匪,然后命令操作模式空間的內(nèi)容青瀑,在初始狀態(tài)下模式空間是沒有內(nèi)容的,在每次循環(huán)讀取數(shù)據(jù)的過程中萧诫,模式空間都會被清空并寫入新的內(nèi)容(這里補(bǔ)充一點(diǎn)斥难,sed
命令操作就是 “模式空間” 而不是內(nèi)存,這就是為什么sed
不會改變原文件內(nèi)容的原因帘饶,如果想改變原文件內(nèi)容需要加-i
選項(xiàng))-
sed
工具的執(zhí)行流程圖
24801412821380580.png
- 命令
n
清空當(dāng)前模式空間哑诊,然后讀入下一行(如果sed
語句遇到n
命令會改變正常的執(zhí)行流程),執(zhí)行流程如下:
657782432329429924.png
代碼示例(無論是n
還是N
命令都不要用多少多少行的思維來思考,sed
語句是循環(huán)讀取文件的,應(yīng)該用循環(huán)的思維來思考問題)
(1)使用sed命令打印文件內(nèi)容
etl@bejedw09:/home/etl/cya_2/as/one> sed -n "p" test
0001
0002
0003
0004
0005
0006
0007
0008
(2)使用n命令
etl@bejedw09:/home/etl/cya_2/as/one> sed -n "n;p" test
0002
0004
0006
0008
結(jié)合上面流程圖解釋sed -n "n;p" test
這條命令:
第一次循環(huán)及刻,sed
語句讀入第一行镀裤,跳過穷当,讀入第二行,打印輸出淹禾,
第二次循環(huán)馁菜,sed
語句讀入第三行,跳過铃岔,讀入第四行汪疮,打印輸出,
第三次循環(huán)毁习,sed
語句讀入第五行智嚷,跳過,讀入第六行纺且,打印輸出盏道,
第四次循環(huán),sed
語句讀入第七行载碌,跳過猜嘱,讀入第八行,打印輸出嫁艇,
所以才會變成打印出文件的偶數(shù)行朗伶,打印文件的奇數(shù)行是sed -n "p;n" test
,這里還是很有必要解釋下打印奇數(shù)行的這條命令步咪,首先是p
命令打印文件第一行论皆,然后是n
命令在模式空間內(nèi)刪除第一行,讀入第二行猾漫,注意現(xiàn)在模式空間內(nèi)存在的是文件的第二行數(shù)據(jù)点晴,但是sed
語句本次循環(huán)已經(jīng)執(zhí)行完畢,進(jìn)入第二次循環(huán)悯周,在第二次循環(huán)開始時(shí)清空模式空間粒督,然后讀入文件第三行,然后打印文件第三行队橙,然后以此類推......坠陈,所以才會打印文件的奇數(shù)行,更多關(guān)于打印文件奇偶行的操作請關(guān)注我的另一篇文章 《 Linux之a(chǎn)wk三元運(yùn)算符和打印奇偶行 》
再看下一段代碼
etl@bejedw09:/home/etl/cya_2/as/one> sed -n "2n;p" test
0001
0003
0004
0005
0006
0007
0008
#在循環(huán)到文件第二行的時(shí)候跳過然后讀入第三行打印捐康,后面的依次打印仇矾,因?yàn)?n代表的是在讀入文件
#第二行的時(shí)候才執(zhí)行n命令,其余行的時(shí)候都是正常執(zhí)行打印操作
- 命令
N
不清空當(dāng)前模式空間解总,然后讀入下一行贮匕,以\n
分隔兩行(如果sed
語句遇到N
命令會改變正常的執(zhí)行流程),執(zhí)行流程如下:
112318452027417218.png
關(guān)于N
命令結(jié)合一個(gè)需求給大家演示一個(gè)例子
etl@bejedw09:/home/etl/cya_2/as/one> cat test
Bob
man
Alice
woman
Peter
man
Julie
woman
#這段文本花枫,奇數(shù)行是人名刻盐,偶數(shù)行是性別掏膏,需求是將人名和對應(yīng)的性別打印在一行,中間用"--"隔開
(1)N命令一
etl@bejedw09:/home/etl/cya_2/as/one> cat test | sed -n "N;p"
Bob
man
Alice
woman
Peter
man
Julie
woman
(2)N命令二
etl@bejedw09:/home/etl/cya_2/as/one> cat test | sed -n "N;s/\n/--/;p"
Bob--man
Alice--woman
Peter--man
Julie--woman
在這里解釋下上面的兩條命令敦锌,我相信聰明的小伙伴看到這里已經(jīng)看出端倪了吧^_^
馒疹,那就是我上面提到過的N
命令的特點(diǎn)不清空當(dāng)前模式空間,然后讀入下一行乙墙,以\n分隔兩行
所以在循環(huán)讀取文件時(shí)模式空間中存儲的內(nèi)容分別是:
Bob\nman
Alice\nwoman
Peter\nman
Julie\nwoman
所以使用sed
的s
命令(替換命令)颖变,將\n
替換成--
就可以完成需求
- 結(jié)尾
本文主要講解sed
命令的 “模式空間” 并介紹了兩個(gè)命令N
、n
听想,由于本文的內(nèi)容有些抽象腥刹,不過篇幅太長會影響大家的閱讀感,所以本文就不在這里啰嗦了汉买,如果看到本文且有不明白的地方衔峰,歡迎大家留言提問!