sed命令

1.sed命令

sed是一個非交互式的文本編輯器,可以對文本文件以及標準輸出進行編輯。

sed命令會將文件或標準輸出中一次選取一行數據,複製進緩衝區,然後讀取編輯的子命令,對行進文本行編輯,重複此過程,直到所有的文本行處理完畢。

sed命令編輯的文件是原始文件的副本,因此編輯操作並不影響原文件,只輸出到屏幕,如果想保存,就重定向到磁盤文件即可。



2.sed命令的使用方法

語法:

sed [選項] [腳本] [輸入文件]


選項:

-n:取消默認輸出。只顯示特殊處理的行。

-e:運行執行多個腳本

-f:後面跟腳本名,從腳本中讀取命令

-i:直接修改原始文件。

-I:大寫i,不區分大小寫。

-l:指定行的長度。

-r:在腳本中使用擴展正則表達式。

-s:默認情況下,sed會把命令行指定的多個文件名作爲一個長的連續的輸入流。而GNU sed則允許把他們當作單獨的文件,這樣的話,正則表達式不進行跨文件匹配。

-u:最低限度的緩存輸入與輸出。


腳本:

用戶可以將一系列的sed命令寫在一個腳本文件中,sed會從該文件中讀取並依次執行各個命令。


輸出文件:

表示輸入文件,沒有指定輸入文件,則從標準輸入中讀取。


三種工作方式:

1.在命令行直接執行sed命令。sed [選項] [命令] [提供數據的文件]

2.將sed的操作寫入腳本,通過-f指定腳本。sed [選項]  -f [腳本] [提供數據的文件]

3.將sed寫入腳本,解釋器爲 #! /bin/sed。./scrpt [提供數據的文件]


定位文本行:

表示方式

意義

例子

x

x爲整數,表示第幾行。

例定位到第10行,則使用10

x,y

定位到連續的行,x行起始,y行結束。

例定位2-5行。則 2,5

x~s

起始行和步長,x行起始,s爲步長

例定位偶數行,則0~2

$

表示定位最後一行。

例最後一行$,第一行就是1

x,+n

表示從x行開始,以後後面n行

例從第2行以及後面5行,則 2,+5


正則表達式定位文本行:語法是  /regexp/

正則

意義

/一般字符/

匹配字符本身,例如 /abc/ 就是匹配包含abc的行

*

表示前面一個字符重複0次或多次。例如 /a*/ 就是a出現0次或多次

\+

表示前面的一個字符出現1次或多次。擴展正則表達式

\?

表示前面的一個字符出現0次或1次

\{x\}

表示前面一個字符出現x次,例如 /a\{3\}/ 匹配 aaa

\{x,y\}

表示前面一個字符出現x次到y次。例 /a\{1,2\}/ 匹配a或者aa

\{x,\}

表示前面一個字符至少出現x次。

.

匹配任意字符

^

匹配行首字符,例 ^aa  則匹配aa開頭的行

$

匹配行尾字符,例 aa$ 則匹配aa結尾的行

[]

匹配中括號內的任意字符

[^]

匹配中括號內不出現的字符

\n

匹配換行符



3.sed的常用操作以及使用方法

3.1 sed編輯命令的基本語法-總的語法

語法:

[位置參數1[,位置參數2]]  子命令 [子命令參數]


介紹:

位置參數:可以用行號或者正則來表示。指定了位置參數,對匹配的行進行操作。沒有指定位置參數對全部的內容進行操作。

子命令:sed提供的子命令,用來實現編輯操作。

子命令參數:子命令的參數。


子命令:

p:將緩存區的文本行輸出出來。

s:替換命令。可以通過標誌決定替換的模式,g:全局。十進制數字:第幾個。p:第一個並輸出。w:第一個並輸出到磁盤。空:替換第一個。

d:刪除文本。

a:在匹配的行的下面另起一行追加內容。

i:在匹配的行的上面另起一行追加內容。


3.2 選擇文本 p

子命令p可以把位置參數篩選出來的參數,顯示出來。。語法如下:

[位置參數1[,位置參數2]]  p


實例:

1.行定位的方法,顯示文本行。

顯示文件的1~3行,不使用-n選項。

# sed 1,3p 1.txt

eeee

eeee

asdada

asdada

adadas

adadas

adsASQWE

SGDFGE


只顯示文件的1~3行,使用-n選項。

# sed -n 1,3p 1.txt

eeee

asdada

adadas


2.正則定位的方法,顯示文本行。

顯示包含dada的行

# sed -n '/dada/p'  1.txt

asdada

adadas


3.3 替換文本 s

s子命令可以對文本進行替換。

[位置參數1[,位置參數2]]  s/匹配字符/替換字符/[標誌]


標誌:

g:全局匹配,會替換文本行中的所有符合規則的字符串。

十進制數字:數字爲n,則替換第n個符合規則的字符串。

p:替換第一個,並輸出到標準輸出。

w:替換第一個,並輸出到磁盤文件中。

空:不加標誌,則替換第一個。


實例:

1.替換文件的內容。

把文件的a替換成大寫A。

# sed  's/a/A/g' 1.txt  

eeee

AsdAdA

AdAdAs

AdsASQWE


2.對指定的行進行替換。

把文件1~3行的a替換成A。

# sed '1,3  s/a/A/g' 1.txt      

eeee

AsdAdA

AdAdAs

adsASQWE


3.4 刪除文本 d

子命令d可以實現文本行刪除。語法如下:

[位置參數1[,位置參數2]]  d


實例:

1.刪除文件的行

刪除文件的第一行

# sed '1d' 1.txt

asdada

adadas

adsASQWE


刪除文件的最後一行

# sed '$d' 1.txt


刪除空白行

# sed '/^$/d' 1.txt  


3.5 追加文本 a

在匹配到的行的下面插入文本。

[位置參數1]  a  文本


實例:

在passwd文件 root 開頭的行的後面插入一行aaaaaaaaa

# sed '/^root/ a aaaaaaaaaaaaaaaaaaa' passwd

root:x:0:0:root:/root:/bin/bash

aaaaaaaaaaaaaaaaaaa

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin


3.6 插入文本 i

在匹配到的行的上面插入文本。

[位置參數1]  i  文本


實例:

在passwd文件 root 開頭的行的上面插入一行aaaaaaaaa

# sed '/^root/ i aaaaaaaaaaaaaaaaaaa' passwd

aaaaaaaaaaaaaaaaaaa

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin


3.7 調換位置 ()

例如調換passwd文件第一列和最後一列的位置。可以使用sed,語法如下:

sed -r 's/(表達式1):(表達式2):(表達式3)/\3\2\1/' [文件/數據流]


實例1:

調換passwd文件第一列和最後一列的位置

# sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/'  passwd

/bin/bash:x:0:0:root:/root:root

/sbin/nologin:x:1:1:bin:/bin:bin

/sbin/nologin:x:2:2:daemon:/sbin:daemon


解釋:

([^:]+):(.*):([^:]+):根據順序,每一個小括號都在以後變換位置的時候,分別對應 123。

([^:]+)::匹配不是冒號的字符一個或多個然後分隔符是冒號。匹配到的是第一段。

(.*)::匹配任意個任意字符,到冒號結束。也就是匹配第一個冒號和最後一個冒號之間的部分。

([^:]+):匹配的不是冒號的字符一個或多個。也就是匹配了最後一段。

\3:\2:\1:123分別表示三個括號的內容,使用\3\2\1表示重新排列。:即分割符。


實例2:

在passwd文件的最前面插入一段。

# sed -r 's/(.*)/aaa:&/' passwd

aaa:root:x:0:0:root:/root:/bin/bash

aaa:bin:x:1:1:bin:/bin:/sbin/nologin

aaa:daemon:x:2:2:daemon:/sbin:/sbin/nologin


解釋:

(.*):可以匹配整個行,用小括號括起來是爲了用數字調用。

aaa:&:aaa:是插入的內容。&表示括號的內容。也可以用 轉義1(\1)表示。


實例3:

把文件中的4段倒敘排列。

# cat 1.txt

111:222:333:444

# sed -r 's/(.*):(.*):(.*):(.*)/\4:\3:\2:\1/' 1.txt  

# sed -r 's/(.*):(.*):(.*):([^:]+)/\4:\3:\2:\1/' 1.txt

444:333:222:111



4. 組合命令

sed支持多個子命令組合一起用。對文本進行多個不同的操作,使用-e選項可以在一條sed命令中完成這些操作。


4.1 使用-e執行多個子命令

可以將sed後面的多個子命令使用-e鏈接起來。

# sed -e '/^1111$/ a 2222' -e '/^1111$/ i 0000' 2.txt

0000

1111

2222

3333


4.2 使用;分號執行多個子命令

# sed -n -e 's/a/A/g ; 1,3p' 1.txt

eeee

AsdAdA

AdAdAs


4.3對一個地址使用多個子命令

如果對一個文件指定的行進行很多次操作, sed命令提供了對同一個地址使用多次子命令的語法。如下:

位置參數 {

子命令1

子命令2

子命令3

...

}

也可以寫在一行

位置參數 {子命令1;子命令2;子命令3;...}


實例:

對 1.txt 的1~5行,進行2次替換,和一次插入。

# sed -n '1,5 {

>s/a/A/g

> s/b/B/g

> 2 i 20180425

> p

> }' 1.txt


4.4 sed腳本

還可以把sed腳本寫在腳本里。腳本里的特殊字符需要轉義。格式如下:

sed -f 腳本 [文件/數據流]


實例:

就是把子命令一行一行的寫在腳本里,然後通過-f指定腳本文件即可。

# vim 1.sed

s/a/A/g

s/b/B/g

2 i 20180425


# sed -f 1.sed 1.txt

eeee

20180425

AsdAdA

AdAdAs

AdsASQWE

SGDFGE

XVCZS

dsgfsd

dfsd


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章