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 [提供數據的文件]
定位文本行:
正則表達式定位文本行:語法是 /regexp/
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