Linux sed 命令詳解

haoge0205發表於2020-03-30

Linux sed 命令詳解

Linux sed 命令是利用指令碼處理文字檔案。

sed 可按照指令碼的指令來處理、編輯文字檔案。

sed 主要用於自動編輯一個或多個檔案、簡化對檔案的反覆操作、編寫轉換程式等。

語法:

sed [-hnV][-e<script>][-f<script檔案>][文字檔案]

引數說明:

-e <script>或--expression=<script> 以選項中指定的script來處理輸入的文字檔案。

-f <script檔案>或--file=<script檔案> 以選項中指定的script檔案來處理輸入的文字檔案。

-h 或--help 顯示幫助。

-n 或--quiet或--silent 僅顯示script處理後的結果。

-V 或--version 顯示版本資訊。

動作說明:

a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~

c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!

d :刪除,因為是刪除啊,所以 d 後面通常不接任何咚咚;

i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);

p :列印,亦即將某個選擇的資料印出。通常 p 會與引數 sed -n 一起執行~

s :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 就是啦!

元字符集:

^ 指定行的開始

$ 指定行的結尾

. 匹配一個非換行符的字元

* 匹配零個或多個字元

[] 匹配指定字元內的任一字元

[^] 匹配不在指定字元內的任一字元

.. 儲存已匹配的字元

&  s/super/YY&yy/   super變成YYsuperyy   & 儲存搜尋字元用來替換其他字元

\< 詞首定位符 /\<my/  匹配包含以my開頭的單詞的行

\> 詞尾定位符 /my\>/  匹配包含以my結尾的單詞的行

x\{m\} 連續m個x /9\{5\}/ 匹配包含連續5個9的行

x\{m,\} 至少m個x /9\{5,\}/  匹配包含至少連續5個9的行

x\{m,n\} 至少m個,但不超過n個x /9\{5,7\}/  匹配包含連續5到7個9的行

例項:

在testfile檔案第四行後新增一行,並將結果輸出到標準輸出,在命令列提示符輸入如下命令:

sed -e 4a\hellowolrd testfile

檢視testfile 中的內容:

[root@127-0-0-1 yoon]# cat testfile.txt

HELLO LINUX!

Linux is a free unix-type opterating system.

This is a linux testfile!

good good study!

Linux test

使用sed命令後,輸出結果如下:

[root@127-0-0-1 yoon]# sed -e 4a\helloworld testfile.txt

HELLO LINUX!

Linux is a free unix-type opterating system.

This is a linux testfile!

good good study!

helloworld

Linux test

[root@127-0-0-1 yoon]# sed -e '4a\hello world' testfile.txt

HELLO LINUX!

Linux is a free unix-type opterating system.

This is a linux testfile!

good good study!

hello world

Linux test

以行為單位的新增和刪除

刪除

將testfile的內容列出並且列印行號,同時刪除第4-5行刪除

[root@127-0-0-1 yoon]# nl testfile.txt

     1 HELLO LINUX!

     2 Linux is a free unix-type opterating system.

     3 This is a linux testfile!

     4 good good study!

     5 hello world

     6 Linux test

[root@127-0-0-1 yoon]# nl testfile.txt | sed '4,5d'

     1 HELLO LINUX!

     2 Linux is a free unix-type opterating system.

     3 This is a linux testfile!

     6 Linux test

sed的動作為'4,5d',d是刪除,因為4-5行刪除了,所以顯示的資料沒有4-5行,另外,原本應該要下達 sed -e 才對,沒有 -e 也可以。同事注意,sed 後面接的動作,務必以 '' 兩個單引號擴住。

只刪除第二行:

[root@127-0-0-1 yoon]# nl testfile.txt | sed '2d'

     1 HELLO LINUX!

     3 This is a linux testfile!

     4 good good study!

     5 hello world

     6 Linux test

刪除第三行到最後一行:

[root@127-0-0-1 yoon]# nl testfile.txt | sed '3,$d'    ($代表最後一行)

     1 HELLO LINUX!

     2 Linux is a free unix-type opterating system.

新增

在第二行後面加上drink milk 字樣(亦即是加在第三行):

[root@127-0-0-1 yoon]# nl testfile.txt | sed '2a drink milk'

     1 HELLO LINUX!

     2 Linux is a free unix-type opterating system.

drink milk

     3 This is a linux testfile!

     4 good good study!

     5 hello world

     6 Linux test

如果加入到第二行前:

[root@127-0-0-1 yoon]# nl testfile.txt | sed  '2i drink milk'

     1 HELLO LINUX!

drink milk

     2 Linux is a free unix-type opterating system.

     3 This is a linux testfile!

     4 good good study!

     5 hello world

     6 Linux test

如果是增加兩行以上,在第二行後面加入兩行字,例如,drink milk,eat pig :

[root@127-0-0-1 yoon]# nl testfile.txt | sed '2a drink milk\  (每一行之間都必須要以反斜槓『 \ 』來進行新行的新增)

> eat pig'

     1 HELLO LINUX!

     2 Linux is a free unix-type opterating system.

drink milk

eat pig

     3 This is a linux testfile!

     4 good good study!

     5 hello world

     6 Linux test

[root@127-0-0-1 yoon]# nl testfile.txt | sed '2a drink milk\neat pig'  (\n換行符)

     1 HELLO LINUX.

     2 This is a linux testfile.

drink milk

eat pig

     3 good good study.

     4 hello world.

     5 Linux test.

     6 #This is good !

追加一行的話,不需要換行符\n,只有追加多行的情況下才需要換行符,最後一行也無需新增換行符,新增的話會多出一個空格

在第四行新增一行:

[root@127-0-0-1 yoon]# sed -e '4a new world' testfile.txt

HELLO LINUX.

This is a linux testfile.

good good study.

hello world.

new world

Linux test.

#This is good !

在第四行追加兩行:

[root@127-0-0-1 yoon]# sed -e '4a new world\nold world' testfile.txt

HELLO LINUX.

This is a linux testfile.

good good study.

hello world.

new world

old world

Linux test.

#This is good !

在第四行追加三行(兩行文字和一行空格):

[root@127-0-0-1 yoon]# sed -e '4a new world\nold world\n' testfile.txt

HELLO LINUX.

This is a linux testfile.

good good study.

hello world.

new world

old world

Linux test.

#This is good !

新增一個空行:

[root@127-0-0-1 yoon]# sed -e '4a \\' testfile.txt

HELLO LINUX.

This is a linux testfile.

good good study.

hello world.

Linux test.

#This is good !

新增兩個空行:

[root@127-0-0-1 yoon]# sed -e '4a \\n' testfile.txt

HELLO LINUX.

This is a linux testfile.

good good study.

hello world.

Linux test.

#This is good !

以行為單位的替換和顯示

將第3-4行替換為 No 2-5 number

[root@127-0-0-1 yoon]# nl testfile.txt | sed '2,5c No 2-5 number' (透過這個方法可以取代整行)

     1 HELLO LINUX!

No 2-5 number

     6 Linux test

僅列出第2-3行:

[root@127-0-0-1 yoon]# nl testfile.txt | sed -n '2,3p'

     2 Linux is a free unix-type opterating system.

     3 This is a linux testfile!

 資料的搜尋並顯示

 搜尋 linux 關鍵字的行:

 [root@127-0-0-1 yoon]# nl testfile.txt | sed '/linux/p'    (如果linux找到,除了輸出所有行,還會匹配輸出行)

     1 HELLO LINUX!

     2 Linux is a free unix-type opterating system.

     3 This is a linux testfile!

     3 This is a linux testfile!

     4 good good study!

     5 hello world

     6 Linux test

使用 -n 的時候只輸出包含模板的行

[root@127-0-0-1 yoon]# nl testfile.txt | sed -n '/linux/p'

     3 This is a linux testfile!

資料的搜尋並刪除

刪除testfile中包含linux的行,其他行輸出:

[root@127-0-0-1 yoon]# nl testfile.txt | sed '/linux/d'

     1 HELLO LINUX!

     2 Linux is a free unix-type opterating system.

     4 good good study!

     5 hello world

     6 Linux test

 資料的搜尋並執行命令

 搜尋 linux 對應的行,執行花括號中的命令,每個命令用分號分隔,並把 testfile 替換成 newtestfile,再輸出這行:

 [root@127-0-0-1 yoon]# nl testfile.txt | sed -n '/linux/{s/testfile/newtestfile/;p;q}'   (最後的 q 是退出)

     3 This is a linux newtestfile!

資料的搜尋並替換

除了整行的處理模式之外,sed 還可以用行為單位進行部分資料的搜尋並替換,基本上 sed 的搜尋與替代的 vi 相當的類似,有點像這樣:

sed 's/要被取代的字串/新的字串/g'

檢視 newtestfile 檔案內容:

[root@127-0-0-1 yoon]# cat newtestfile.txt

eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84

inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

本機的ip是192.168.1.100,將 IP 前面的部分予以刪除:

[root@127-0-0-1 yoon]# cat newtestfile.txt | grep 'inet addr:' | sed 's/^.*addr://g'

192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

接下來則是刪除後續的部分,亦即: 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0,將 IP 後面的部分予以刪除:

[root@127-0-0-1 yoon]# cat newtestfile.txt | grep 'inet addr:' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'

192.168.1.100

多點編輯  sed -e 'cmd' -e 'cmd' filename

一條 sed 命令,將第三行到末尾的資料刪除,並將opterating替換成 newopterating:

[root@127-0-0-1 yoon]# nl testfile.txt

     1 HELLO LINUX!

     2 Linux is a free unix-type opterating system.

     3 This is a linux testfile!

     4 good good study!

     5 hello world

     6 Linux test

多條sed:

[root@127-0-0-1 yoon]# nl testfile.txt | sed '3,$d' | sed 's/opterating/newopterating/'

     1 HELLO LINUX!

     2 Linux is a free unix-type newopterating system.

 一條sed:

 [root@127-0-0-1 yoon]# nl testfile.txt | sed -e '3,$d' -e  's/opterating/newopterating/'

     1 HELLO LINUX!

     2 Linux is a free unix-type newopterating system.

( -e 表示多點編輯,第一個 -e 編輯第三行到最後一行刪除,第二個 -e 搜尋 opterating替換成 newopterating)

直接修改檔案內容

將 testfile 檔案中的每一行結尾為 . 修改為 !:

[root@127-0-0-1 yoon]# cat testfile.txt

HELLO LINUX.

This is a linux testfile.

good good study.

hello world.

Linux test.

[root@127-0-0-1 yoon]# sed 's/\.$/\!/g' testfile.txt

HELLO LINUX!

This is a linux testfile!

good good study!

hello world!

Linux test!

利用 sed 直接在最後一行輸入 #This is good !

[root@127-0-0-1 yoon]# sed -i '$a #This is good !' testfile.txt

[root@127-0-0-1 yoon]# cat testfile.txt

HELLO LINUX.

This is a linux testfile.

good good study.

hello world.

Linux test.

#This is good !


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28939273/viewspace-2683389/,如需轉載,請註明出處,否則將追究法律責任。

相關文章