sed 增刪改查詳解以及 sed -i原理

我爲何要詳細記錄sed命令:

    sed 擅長取行。工做中三劍客使用頻率最高,本篇文章將對sed命令經常使用的 增,刪,改,查
node

進行詳細講解,以備之後工做中遺忘了查詢,sed命令是做爲運維人員來講,必須必掌握的技能正則表達式

若是三劍客你不會,那麼你不用作運維了。運維


sed簡介:編輯器

是一種流編輯器,它是文本處理中很是中的工具,可以完美的配合正則表達式使用,功能與衆不同。處理ide

時,把當前處理的行存儲在臨時緩衝區中,稱爲「模式空間」(pattern space),接着用sed命令處理緩工具

衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。測試

文件內容並無 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件spa

的反覆操做;編寫轉換程序等。
orm


添加測試文本:blog

cat >sed.log<<"EOF"

101,$oldboy,CEO

102,$zhangyao,CTO

103,$Alex,COO

104,$yy,CFO

105,$feixue,CIO

>>"EOF"



sed的語法格式:

sed [選項] [指令] [輸入文件]


sed命令的執行流程:

sed命令是把文件一行行的讀到內存中當成一行處理, 它也被稱爲流編輯器,跟車間中的流水線同樣,一行一行的逐個處理。獲取到須要的內容後顯示到屏幕上。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=




sed原理:

sed 讀取一行內容後,sed判斷是否知足條件



sed版本查看:

 sed -v

sed基礎參數:

-n 取消默認輸出

-r 支持正則表達式

-p 打印

-e 多項編輯

-i.bak  修改後備份 

s 搜索一次

sg 搜索全局

# # #  : s#替換前#替換後#g

/ / / : 與###同樣


sed功能詳解:

sed增長:

-i : 在 XX行的下一行增長內容

-a: 在XX行的上一行增長內容



sed  i參數 :演示
增:
案例1:sed單行增長
[root@chenleilei ~]# sed '2i nihaoya' sed.log
101,$oldboy,CEO
nihaoya
102,$zhangyao,CTO
103,$Alex,COO
104,$yy,CFO
105,$feixue,CIO
案例2:sed行前多行增長
[root@chenleilei ~]# sed '2i nihaoya\nwohenhao' sed.log
101,$oldboy,CEO
nihaoya
wohenhao
102,$zhangyao,CTO
103,$Alex,COO
104,$yy,CFO
105,$feixue,CIO



-a:演示

【增】案例1:sed行後單行增長
[root@chenleilei ~]# sed '2a nihaoya' sed.log
101,$oldboy,CEO
102,$zhangyao,CTO
nihaoya
103,$Alex,COO
104,$yy,CFO
105,$feixue,CIO 
【增】案例2:sed行後多行增長

[root@chenleilei ~]# sed '2a nihaoya\nwohenhao' sed.log

101,$oldboy,CEO

102,$zhangyao,CTO

nihaoya

wohenhao

103,$Alex,COO

104,$yy,CFO

105,$feixue,CIO

【增】案例3:sed 不一樣行多項增長 sed -e
[root@chenleilei ~]# sed -e '2i 123' -e '5i 456' sed.log
101,$oldboy,CEO
123
102,$zhangyao,CTO
103,$Alex,COO
104,$yy,CFO
456
105,$feixue,CIO



sed刪除 (d)

【刪】sed刪除案例1: 刪除指定行

[root@chenleilei ~]# sed  '4d' sed.log
101,$oldboy,CEO
102,$zhangyao,CTO
103,$Alex,COO
105,$feixue,CIO


【刪】sed刪除案例2:刪除連續的行

[root@chenleilei ~]# sed  '2,4d' sed.log
101,$oldboy,CEO
105,$feixue,CIO


【刪】sed刪除案例3:刪除不連續的行

seq 10 |sed -e{2,4,8}d    ##注意這裏不能添加引號或者雙引號,不然報錯


【刪】sed 刪除案例4: 刪除 n和n 匹配的行

[root@chenleilei ~]# sed -nr '/103|105/!p' sed.log 
101,$oldboy,CEO
102,$zhangyao,CTO
104,$yy,CFO                ### !除了103.105開頭的行 都刪除 而後打印


.替換】sed修改案例1:

修改:

 案例1:修改單個字符

[root@chenleilei ~]# sed  's#102#1031#g' sed.log
101,$oldboy,CEO
1031,$zhangyao,CTO
103,$Alex,COO
104,$yy,CFO
105,$feixue,CIO


案例2: 修改101爲109

[root@chenleilei ~]# sed  -r '1s#[0-9]+#109#' sed.log
109,$oldboy,CEO
102,$zhangyao,CTO
103,$Alex,COO
104,$yy,CFO
105,$feixue,CIO


案例3: 把101改成oldboy  ----報錯緣由:sed -r 一個一個讀取,讀取到有數字就改成

oldboy,這裏有3個數字,因此出現了3個oldboy

[root@chenleilei ~]# sed   '1s#[0-9]#oldboy#g' sed.log
oldboyoldboyoldboy,$oldboy,CEO
102,$zhangyao,CTO
103,$Alex,COO
104,$yy,CFO
105,$feixue,CIO

解決辦法(-r):
[root@chenleilei ~]# sed -r  '1s#[0-9]+#oldboy#g' sed.log
oldboy,$oldboy,CEO
102,$zhangyao,CTO
103,$Alex,COO
104,$yy,CFO
105,$feixue,CIO

若是配錯了那麼3個oldboy 如何改回101呢?
[root@chenleilei ~]# sed -r '1s#(oldboy)+#101#' sed.log
101,$oldboy,CEO
102,$zhangyao,CTO
103,$Alex,COO
104,$yy,CFO
105,$feixue,CIO

若是你寫成了
sed -r '1s#(oldboy)+#101#g' sed.log  
也會不成功,那是由於 他有g選項,會所有替換,也就是3個oldboy。解決辦法
把 oldboy 使用括號括起來,而後使用 s 尾部的g不要使用,g就是變成3個oldboy的源泉


sed -ri 修改後備份,可是,i 必需要放在最後,不然沒法備份

例子: sed -ri '/^123/d' 1.txt


sed -i 的工做原理:

    sed -i.bak修改文件的時候,他會把源文件移動,而後建立新的文件,寫入這個命令的結果。

能夠經過修改文件後使用 ls -il  x x.bak   來查看 x文件 和他的備份文件 x.bak 。你會發現他們的inode就不同了。這就是sed -i.bak 的原理


小問題:

echo用來給文件追加多行內容的時候,須要使用 echo -e



【查詢】  |  是正則符號須要加r

[顯示] 1到4行

[root@chenleilei ~]# sed -n '1,4p' sed.log

101,$oldboy,CEO

102,$zhangyao,CTO

103,$Alex,COO

104,$yy,CFO


【查詢】  |  是正則符號須要加r

  排除1-4行

[root@chenleilei ~]# sed  -n '1,4!p' sed.log
105,$feixue,CIO


[查詢]顯示2 4 兩行

[root@chenleilei ~]# sed -nr '/2|4/p' sed.log
102,$zhangyao,CTO
104,$yy,CFO


[查詢] 查詢103開頭的行

[root@chenleilei ~]# sed -n '/^103/p' sed.log
103,$Alex,COO


[查詢] 查詢103結尾的行

[root@chenleilei ~]# sed -n '/$103/p' sed.log 
103,$Alex,COO,103


[查詢] 查詢103開頭105開頭的行(正則)

[root@chenleilei ~]# sed -n '/^103/,/^105/p' sed.log
103,$Alex,COO
104,$yy,CFO
105,$feixue,CIO


[查詢] 查詢 105以及 和 103 開頭的行(正則 須要加 r)

[root@chenleilei ~]# sed -nr '/^103|^105/p' sed.log
103,$Alex,COO
105,$feixue,CIO



[排除] 排除一行

[root@chenleilei ~]# sed  -n '1!p' sed.log
102,$zhangyao,CTO
103,$Alex,COO
104,$yy,CFO
105,$feixue,CIO


[排除] 排除多行

[root@chenleilei ~]# sed  -n '1,2!p' sed.log
103,$Alex,COO
104,$yy,CFO
105,$feixue,CIO


[排除不連續的行]

[root@chenleilei ~]# sed -nr '/102|104/!p' sed.log 101,$oldboy,CEO103,$Alex,COO105,$feixue,CIO
相關文章
相關標籤/搜索