想掌握強(qiáng)大的sed工具?收藏本文就夠了!

1. 如果要將sed編輯的結(jié)果寫入文件,需要-i參數(shù),如果存在多個(gè)編輯指令,需要在前面添加-e參數(shù)

sed -i -e 's/hhhhh/hello/g' -i -e 's/ha/ho/g' test ,不能寫成-ie (注意:i 必須在e之前,否則會(huì)報(bào)錯(cuò))

2. ?刪除最后一行 sed '$d' file(注意這里的$和vi編輯命令中使用字符串替換命令時(shí)的$意思類似,表示文件的最后一行,不是代表單純輸入$時(shí)表示跳到一行的末尾)

3. ?刪除所有行的命令sed ?'1,$d' file,如果配合-i則相當(dāng)于是清空文件(和vi編輯中?:1,$s/word1/word2/g類似,但后者需要文檔中都是同樣的單詞)

4. ?sed中刪除第n行是sed 'nd' file(類似vi編輯命令中刪除一行是使用dd),反之需要僅僅保留某行時(shí),輸入sed 'n!d' file

這里的感嘆號(hào)的使用也可以擴(kuò)展,需要活學(xué)活用,比如使用在sed -n 'n!p'即表是將除了第N行之外的所有行打印出來(lái)。

另舉例如下:某文件夾下包含了如下的文件,中間的省略號(hào)表示包含2015時(shí)間的文件有很多

-rw-------. 1 billcs billcs??? 438512 10月 27 17:50 ABM_CMdbInUser.mdb.0058.20150926

-rw-------. 1 billcs billcs??? 438512 10月 27 17:40 ABM_CMdbInUser.mdb.0072.20151010

-rw-------. 1 billcs billcs??? 438512 10月 27 17:50 ABM_CMdbInUser.mdb.0080.20151018

-rw-------. 1 billcs billcs???? 29696 10月 27 17:53 ABM_CMdbInTidB.mdb

為了將所有不包含2015時(shí)間的文件顯示出來(lái),可以使用如下的命令:

ls -l | sed -n '/2015/!p'

5. ?sed 's/linux/bowen/2' file ?表示對(duì)每一行第二個(gè)linux字符串進(jìn)行替換,不滿足條件即使處在整行第二的位置也不替換

注意:s/linux/bowen/的寫法其實(shí)默認(rèn)是省略了1,即和s/linux/bowen/1的含義是一致的,只將每一行的第一個(gè)linux進(jìn)行替換,如果寫成2的話則就是上面的意思了。

6. ?刪除包含某字符串的行sed '/str1/d' file(這也和vi編輯中s/str1/str2/g類似,前面的s和后面的g都是替換字符串需要的,而這里是/d,且/str1就是要將str1找出來(lái)并換成str2,而sed中執(zhí)行刪除時(shí)不是替換,僅需要找出str1出來(lái)而已)

被替換的str1不需要是完整顯示且前后都是空白的字符串,可以只是完整字符串其中的一部分,例如:

file內(nèi)容為

line1?? 1?????? 2?????? 3?????? 4

line2?? hello?? nihao?? haha??? bye

line3 ? xilineha ? linux?? bowen??? xixi

line4?? bowen?? unix??? linux?? haha

執(zhí)行sed 's/line/hoho/2' file,結(jié)果為:

line1?? 1?????? 2?????? 3?????? 4

line2?? hello?? nihao?? haha??? bye

line3 ? xihohoha ? linux?? bowen??? xixi

line4?? bowen?? unix??? linux?? haha

即只將第三行第二個(gè)字符串中的一部分line替換成了hoho

7. ?刪除空行 sed '/^$/d' file(不包括空格,TAB和控制字符行

8. ?sed字符轉(zhuǎn)換的用法 ?sed 'y/1234/ABCD/' file

1)可以這么記憶y,相當(dāng)于是每替換一個(gè)字母時(shí)都需要詢問(wèn)確認(rèn)一下 y or n?(切記是將全文每個(gè)對(duì)應(yīng)的字符都替換,而不是只替換1234字符串

2)和tr相比較,本命令的缺點(diǎn)就是轉(zhuǎn)換字符和被轉(zhuǎn)換字符長(zhǎng)度一定要相等

9. ?sed '/linux/a gbh' file和sed '/linux/a\gbh' file效果一樣(a表示在匹配行的下一行添加內(nèi)容,i表示在上一行添加內(nèi)容)

10. ?讀取外部文件test時(shí),如果test和file在同一個(gè)路徑下,可以直接添加單引號(hào),不需要輸入./test,如下:

sed '/line1/r 'test'' file

建議直接使用絕對(duì)路徑而不添加單引號(hào)

11. 使用p打印命令時(shí)需要添加-n參數(shù),否則因?yàn)閟ed本身會(huì)默認(rèn)將所有的行都打印出來(lái),又由于添加了p命令,所以會(huì)使得結(jié)果中出現(xiàn)重復(fù)的行。

例如:輸入?sed '1p' file,由于未帶-n,第一行出現(xiàn)了重復(fù)

line1?? 1?????? 2?????? 3?????? 4

line1?? 1?????? 2?????? 3?????? 4

line2?? hello?? nihao?? haha??? bye

line3?? hellod? linux?? linux??? xixi

line4?? line5?? unix??? linux?? haha

12. ?sed -f sedrule file 將常用的指令寫入sedrule文件中,通過(guò)-f參數(shù)就可以進(jìn)行調(diào)用,這實(shí)際上是將使用sed時(shí)單引號(hào)中的指令集中放到文件中,便于使用,所以文件中的指令不需要再加單引號(hào)。例如:cat sedrule后顯示:

/^$/d

s/linux/bowen/g

13. ?替換匹配行的下一行 ?sed '/line2/{n;s/hello/bowen/}' file (n可以理解為next的意思

如果不添加n,直接是sed '/line2/{s/hello/bowen/}' file,該命令的含義就是先定位到某一行,然后對(duì)本行進(jìn)行替換操作

14. l(L的小寫)表示列出非打印字符,如常用的查看文件中TAB的命令 sed -n l file

15.?sed -n '$=' test.sh 獲取文件的總行數(shù),和awk 'END{print NR}' test.sh效果一樣

(這和ll | wc -l獲取的結(jié)果是有差異的,wc會(huì)比前兩者少1,因?yàn)閣c是計(jì)算當(dāng)前文件夾下的文件數(shù)再加上文件夾本身。前面兩個(gè)是獲取直觀的文件數(shù)和隱藏的.和..的總和)

16,動(dòng)態(tài)獲取文件的每一行的內(nèi)容?sed -n "${n}p" test.sh ,其中n是變量,所以必須使用雙引號(hào)

注意這里必須使用雙引號(hào),如果n為1,在使用sh -x調(diào)試時(shí)可以發(fā)現(xiàn)會(huì)打印成sed -n '1p' test.sh,即雙引號(hào)此時(shí)解釋成了單引號(hào)

--END--

鑒于數(shù)據(jù)分析能力越來(lái)越成為每個(gè)職場(chǎng)人的必備技能,所以我最近新打造了本垂直公號(hào),這里聚焦分享數(shù)據(jù)分析和腳本編程的干貨,歡迎大家都轉(zhuǎn)起來(lái),讓更多的人來(lái)一起碰撞,交流,提升!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容