打开高效文本编辑之门_Linux sed之多行命令与循环命令
Linux sed之多行命令與循環(huán)命令使用案例
聲明與簡介
sed:Stream Editor文本流編輯,sed是一個“非交互式的”面向字符流的編輯器。
sed模式匹配是對文件的一行內(nèi)容進行處理,除非我們用到H、G、N命令這種方式才會追加個\n即產(chǎn)生個新行。
數(shù)據(jù)說明
1 emp_2line.txt,該數(shù)據(jù)奇數(shù)行是員工名、偶數(shù)行是員工職位。比如第3行Jim是員工的名字、第4行manager是他的職位。
Tom ceo Jim manager Jack salesman Kate manager Luke developer Nancy tester Lily hr John tester2?emp_3_line.txt該數(shù)據(jù)奇數(shù)行是員工名、員工職位、員工職位簡介以#號包裹。第一行的tom是CEO,它的職位簡介是#chief executive officer#。
Tom ceo #chief executive officer # Jim manager #IT manager# Jack salesman #Responsible for goods sales# Kate manager #operations manager# Luke developer #web developer# Nancy tester #Test Engineer# Lily hr #Human Resources# John tester #Quality Assurance#多行命令
Sed里如何產(chǎn)生多行。
N命令
這里的N命令和模式空間與保持空間章節(jié)里的n類似但又有不同,它不會打印和清空當(dāng)前模式空間里的內(nèi)容,而是在當(dāng)前模式空間里加個回車”\n”,從原文件里讀取一行追加到模式空間里。重復(fù)循環(huán)執(zhí)行模式空間匹配的流程。
注:這個效果類似于一下子讀取兩行到模式空間里。
模式空間接成多行
# 打印出所以的員工和職位,并以“,“分割。 sed -e '{N;s/\n/,/'} emp_2line.txt # 結(jié)果 Tom,ceo Jim,manager Jack,salesman Kate,manager Luke,developer Nancy,tester Lily,hr John,tester 注: 1 如果想匹配職位是“manager“的,可以通過管道”|“再結(jié)合sed匹配來實現(xiàn)。 # 僅顯示員工職位是manager的員工名稱和職位(N命令方式)。 sed -e '{N;s/\n/,/'} emp_2line.txt | sed -n '/manager/p' # 結(jié)果 Jim,manager Kate,managerP命令
P命令類似小寫的p命令(模式空間打印),它和p類似只不過,它在碰到換行符”\n”時才打印,打印換行符前的內(nèi)容。
模式空間打印多行的第一行
# N命令結(jié)合P實現(xiàn)員工職位是manager的員工名 sed -n -e 'N' -e '/manager/P' emp_2line.txt # 結(jié)果 Jim Kate#注:這里加了P名,即碰到”\n”時才打印,打印其前面的內(nèi)容(也就是打印多行內(nèi)容的第一行)。D命令
大寫的D命令在遇到第一個換行標(biāo)識(“\n”)時才停止刪除(含\n),終止執(zhí)行余下的sed命令,從頭再執(zhí)行(新的循環(huán))。
If pattern space contains newlines, delete text in the pattern space up to the first newline, and restart cycle with the resultant pattern space, without reading a new line of input.
If pattern space contains no newline, start a normal new cycle as if the?d?command was issued.
# 官網(wǎng)參考鏈接
https://www.gnu.org/software/sed/manual/html_node/sed-commands-list.html
P命令結(jié)合D命令示例
#顯示匹配manager的員工名和職位名,完成該功能有多個方法。這里主要解釋P、D命令結(jié)合起來使用的原理或者過程。 sed -n -e 'N' -e '/manager/P;D' emp_2line.txt # 結(jié)果 Jim manager Kate manager # 執(zhí)行過程詳解 # Step1:假如sed遍歷到“Jim”所在的行,那么因為有N命令,所以此時模式空間里的內(nèi)容為 Jim\nmanager # Step2; P命令打印多行的第一行的內(nèi)容,此時為Jim # Step3: D命令的作用是刪除模式空間里截止到首個\n的內(nèi)容(含\n)即有manager # 因為P和D都會追加個換行,所以最后的輸出是: Jim manager 同理分析其它數(shù)據(jù)。刪除多行特殊符號匹配
# 刪除文件內(nèi)的崗位描述后輸出員工信息(員工名、員工職位)。 # Way1 sed -e '/#/{N;/#.*#/{s/#.*#// }}' emp_3line.txt # Way2 使用第一種方式即可,當(dāng)前方法主要是演示P和D怎樣結(jié)合起來使用。 sed -e '/#/{N;/#.*#/{s/#.*#//;P;D}}' emp_3line.txt # 結(jié)果 Tom ceo Jim manager Jack salesman Kate manager Luke developer Nancy tester Lily hr John tester # 過程詳解 # Step1 /#/{ 最外層的循環(huán)是以”#”來匹配所有要處理的內(nèi)容。 # Step2 N是從輸入文件里獲得下一行并追加到模式空間。 # Step3 /#.*#/ 這個是通過首和尾都是“#”的來匹配內(nèi)容。如果匹配到就進入下一個步驟。 # Step4 s/#.*#//;P;D 這一步的替換是將包含和尾都是“#”的內(nèi)容都替換為空字符串,P是打印\n前的內(nèi)容,D是刪除\n后的內(nèi)容。 注:a 以實際例子來說明。比如此時針對已經(jīng)讀到第2行 1 Tom 2 ceo #chief executive officer # 3 Jim 1:由Step1、Step2知道滿足匹配 #,這時需要將“\n”和下一行的內(nèi)容追加到模式空間,因為有N。這里模式空間里的內(nèi)容為: ceo#chief executive officer #\nJim 2 :又因為滿足Step3,所以進入內(nèi)部的step4,此時因為有替換所以內(nèi)容為 ceo\nJim。又有P即打印出ceo\nceo\nJim\n;因為p和P類似會在追加個換行符號。 此時的D又做了刪除對應(yīng)第一個ceo\n,所以最終為ceo\nJim\n。 3 :然后從第4行 manager #IT 繼續(xù)重復(fù)執(zhí)行。 b) 以第4行為例: 4 manager #IT 5 manager# 1: 假如讀取到第4行,因為Step1、Step2,這時需要追加第5行到模式空間即manager #IT\n manager# 2: 又因為滿足Step3,此時又進入step4,因為替換,所以當(dāng)前內(nèi)容為\n,因為P是打印換行前的內(nèi)容所以為manager\nmanager\n。D又做了刪除(刪除第一個manager\n),所以最終是manager\n。標(biāo)簽命令
如果想在sed的執(zhí)行流程加入控制,則可以通過b即標(biāo)簽,類似goto跳轉(zhuǎn)的功能。
跳轉(zhuǎn)命令
# 對員工名和職位用@來分割;崗位是manager的在其最前頭加上” ~”。該腳本命名為goto.sed。 # 腳本詳情 #!/bin/sed -nf h;n;H;x s/\n/\t/ /manager/!b lab_mg s/^/~/ :lab_mg P # 賦予可執(zhí)行權(quán)限。 chomod +x goto.sed # 執(zhí)行 ./goto.sed emp_2line.txt # 結(jié)果 Tom ceo ~Jim manager Jack salesman ~Kate manager Luke developer Nancy tester Lily hr John tester #過程詳解: # Step1:每一行遍歷時通過n命令將下一行放入保持空間,通過H將模式空間的內(nèi)容追加到方式保持空間里,以Tom所在行為例,此時保持空間的內(nèi)容為Tom\nceo Step2:x交換,則此時模式空間里為Tom\nceo Step3:結(jié)合s替換,則\n替換為了\t即制表符。 針對lab_mg的則是匹配到manager關(guān)鍵字即在模式空間里最前方以~輸出。循環(huán)命令
重復(fù)執(zhí)行
# 新增label.sed文件并輸入如下內(nèi)容: #!/bin/sed -nf h;n;H;x s/\n/\t/ :lab_t /manager/s/^/~/ /~~~/!t lab_t P #賦執(zhí)行權(quán)限 chomod +x label.sed #執(zhí)行 ./label.sed emp_2line.txt #結(jié)果 Tom ceo ~~~Jim manager Jack salesman ~~~Kate manager Luke developer Nancy tester Lily hr John tester #過程詳解 # Step1:每一行遍歷時通過n命令將下一行放入保持空間,通過H將模式空間的內(nèi)容追加到方式保持空間里,以Tom所在行為例,此時保持空間的內(nèi)容為Tom\nceo Step2:x交換,則此時模式空間里為Tom\nceo Step3:結(jié)合s替換,則\n替換為了\t即制表符。 這里主要將下“重復(fù)”環(huán)節(jié): Step 4:如果模式空間里匹配到manager則將行頭替換 “~”,相當(dāng)于添加。 Step 5:如果該行不包含三個“~”,即“~~~”就跳轉(zhuǎn)到行首添加“~”的過程,即Step4。直到該行有了三個~”。這種往復(fù)的過程叫做repeat(循環(huán)執(zhí)行)。總結(jié)
以上是生活随笔為你收集整理的打开高效文本编辑之门_Linux sed之多行命令与循环命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 打开高效文本编辑之门_Linux sed
- 下一篇: 打开高效文本编辑之门_Linux awk