sed命令

sed命令

sed 是一種幾乎包括在全部 UNIX 平臺(包括 Linux)的輕量級流編輯器。sed主要是用來將數據進行選取、替換、刪除、新增的命令,和vim很像,但用起來卻不同。vim

sed基本格式

[root@localhost ~]# sed [選項] ‘[動做]’ 文件名編輯器

選項: -n 通常sed命令會把全部數據都輸出到屏幕,若是加入此選擇,則只會把通過sed命令處理的行輸出到屏幕。 -e 容許對輸入數據應用多條sed命令編輯。 -i sed的修改結果直接修改讀取數據的文件, 而不是由屏幕輸出。
動做: a \: 追加,在當前行後添加一行或多行。添加多行時,除最後一行外,每行末尾須要用「\」表明數據未完結。 c \: 行替換,用c後面的字符串替換原數據行。替換多行時,除最後一行外,每行末尾需用「\」表明數據未完結。 i \: 插入,在當期行前插入一行或多行。插入多行時,除最後一行外,每行末尾須要用「\」表明數據未完結。 d 刪除,刪除指定的行。 p 打印,輸出指定的行。 s 字串替換,用一個字符串替換另一個字符串。格式爲「行範 s/舊字串/新字串/g」(和vim中的替換格式相似)。

只看文字解釋還有點不知所云,那麼接下來我用一些例子來講明sed的基本用法。學習

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

在學習sed基本用方法前,我須要指出sed是對行數據進行操做的。

1.查看行內容

[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

2.刪除行數據

[root@localhost ~]# sed ‘2,4d’ student.txt #刪除第二行到第四行的數據,但不修改文件自己。class

ID Name PHP Linux MySQL Average

3.插入數據

[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

4.數據替換

[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成績太好了,我嫉妒他,不想看到他的成績,因此我整了一個查無此人。 
但我以爲這樣整嫌疑有點大,會讓人懷疑的。接下來我要怎麼作呢?

5.字符串替換

[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

最後,還有很重要的一點。我以上的全部操做都不會對原文件作更改,要想更改原文件還須要加上-i選項。

剛剛我執行了那麼多操做,如今來看一下原文件內容:

[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

加上-i選項,sed所執行的操做纔會更改原文件,不然只是更改輸出結果並打印到屏幕上。

相關文章
相關標籤/搜索