sed 是一種幾乎包括在全部 UNIX 平臺(包括 Linux)的輕量級流編輯器。sed主要是用來將數據進行選取、替換、刪除、新增的命令,和vim很像,但用起來卻不同。vim
[root@localhost ~]# sed [選項] ‘[動做]’ 文件名編輯器
選項: -n: 通常sed命令會把全部數據都輸出到屏幕,若是加入此選擇,則只會把通過sed命令處理的行輸出到屏幕。 -e: 容許對輸入數據應用多條sed命令編輯。 -i: 用sed的修改結果直接修改讀取數據的文件, 而不是由屏幕輸出。
動做: a \: 追加,在當前行後添加一行或多行。添加多行時,除最後一行外,每行末尾須要用「\」表明數據未完結。 c \: 行替換,用c後面的字符串替換原數據行。替換多行時,除最後一行外,每行末尾需用「\」表明數據未完結。 i \: 插入,在當期行前插入一行或多行。插入多行時,除最後一行外,每行末尾須要用「\」表明數據未完結。 d: 刪除,刪除指定的行。 p: 打印,輸出指定的行。 s: 字串替換,用一個字符串替換另一個字符串。格式爲「行範 圍s/舊字串/新字串/g」(和vim中的替換格式相似)。
只看文字解釋還有點不知所云,那麼接下來我用一些例子來講明sed的基本用法。學習
下面的具體操做將圍繞這張學生成績表展開spa
[root@localhost ~]# vim student.txt ID Name PHP Linux MySQL Average 1 Jaking 82 95 86 87.66 2 Geling 74 96 87 85.66 3 igi 99 83 93 91.66
[root@localhost ~]# sed ‘2p’ student.txt
查看文件的第二行code
ID Name PHP Linux MySQL Average 1 Jaking 82 95 86 87.66 1 Jaking 82 95 86 87.66 2 Geling 74 96 87 85.66 3 igi 99 83 93 91.66
這樣的結果意不意外,驚不驚喜?
其實,sed查看了第二行事後,還會再查看文件的所有內容,而後輸出到屏幕上。
要想只查看第二行的內容要怎麼辦呢?請看下面的例子:字符串
[root@localhost ~]# sed -n ‘2p’ student.txtit
1 Jaking 82 95 86 87.66
加了-n事後,sed只會把通過sed命令處理的行輸出到屏幕,這樣就能夠實現想要實現的結果了。io
[root@localhost ~]# sed ‘2,4d’ student.txt #刪除第二行到第四行的數據,但不修改文件自己。class
ID Name PHP Linux MySQL Average
[root@localhost ~]# sed ‘2a Hello’ student.txt #在第二行後追加hellosed
ID Name PHP Linux MySQL Average 1 Jaking 82 95 86 87.66 Hello 2 Geling 74 96 87 85.66 3 igi 99 83 93 91.66
[root@localhost ~]# sed ‘2i Hello \ nWorld’ student.txt #在第二行前插入兩行數據
ID Name PHP Linux MySQL Average 1 Jaking 82 95 86 87.66 Hello World 2 Geling 74 96 87 85.66 3 igi 99 83 93 91.66
對這樣的結果有疑問?n去哪了?
\n是表示回車換行的意思。
說到這裏補充一點,當插入動做未完結時能夠在後面加\,追加和替換的未完結動做也同樣,在後面加\ 。 [root@localhost ~]# sed '2i Hello World\ > Hello Jaking' student ID Name PHP Linux MySQL Average 1 Jaking 82 95 86 87.66 Hello World Hello Jaking 2 Geling 74 96 87 85.66 3 igi 99 83 93 91.66
[root@localhost ~]# sed ‘4c No such person‘ student.txt
ID Name PHP Linux MySQL Average 1 Jaking 82 95 86 87.66 2 Geling 74 96 87 85.66 No such person
What? igi去哪了?
由於我以爲igi成績太好了,我嫉妒他,不想看到他的成績,因此我整了一個查無此人。
但我以爲這樣整嫌疑有點大,會讓人懷疑的。接下來我要怎麼作呢?
[root@localhost ~]# sed ‘4s/99/59/g’ student.txt
ID Name PHP Linux MySQL Average 1 Jaking 82 95 86 87.66 2 Geling 74 96 87 85.66 3 igi 59 83 93 91.66
哈~ igi最高一門課程的分數被我改爲59分了。。
但仔細想一想這操做好像哪裏不對~~
igi平均分竟然仍是91.66,這就不科學了,應該是78.33纔對!
因而我再想辦法…
[root@localhost ~]# sed -e ‘4s/99/59/g;4s/91.66/78.33/g’ student.txt
ID Name PHP Linux MySQL Average 1 Jaking 82 95 86 87.66 2 Geling 74 96 87 85.66 3 igi 59 83 93 78.33
加上-e,能夠同時替換多個數據,這一波操做事後就完美了。
不過,還沒完呢!有人跟我說Geling的PHP課程缺考,他竟然還有74分!這不科學呀!
沒事,讓我來:
[root@localhost ~]# sed ‘3s/74//g’ student.txt
ID Name PHP Linux MySQL Average 1 Jaking 82 95 86 87.66 2 Geling 96 87 85.66 3 igi 59 83 93 78.33
在//中不寫替換內容便可實現「擦除」操做。
但我感受這樣還不完美,更完美的作法是:
root@localhost ~]# sed -e ‘3s/74/缺考/g’;3s/85.66/91.5/g’ student.txt
ID Name PHP Linux MySQL Average 1 Jaking 82 95 86 87.66 2 Geling 缺考 96 87 85.66 3 igi 59 83 93 78.33
剛剛我執行了那麼多操做,如今來看一下原文件內容:
[root@localhost ~]# cat student.txt ID Name PHP Linux MySQL Average 1 Jaking 82 95 86 87.66 2 Geling 74 96 87 85.66 3 igi 99 83 93 91.66
原文件內容沒有任何改變!
Geling的PHP課程缺考是事實,如今怎麼仍是得74分,我須要改原文件。
root@localhost ~]# sed -i -e ‘3s/74/缺考/g’;3s/85.66/91.5/g’ student.txt
ID Name PHP Linux MySQL Average 1 Jaking 82 95 86 87.66 2 Geling 缺考 96 87 85.66 3 igi 59 83 93 78.33
root@localhost ~]# cat student.txt
ID Name PHP Linux MySQL Average 1 Jaking 82 95 86 87.66 2 Geling 缺考 96 87 85.66 3 igi 59 83 93 78.33