日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

打开高效文本编辑之门_Linux sed之多行命令与循环命令

發(fā)布時間:2024/9/27 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 打开高效文本编辑之门_Linux sed之多行命令与循环命令 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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 tester

2?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,manager

P命令

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。