Sed是行處理命令,處理的過程是逐行將需要處理數據讀入到模式空間處理,處理完成打印(默認)模式空間內容並清空模式空間,所以除非是添加特殊參數(-i),否則sed是不會修改文本內容,參數(-n)是不打印緩存空間內容,其他參數內容見下列表
常用選項
命令 | 功能 |
-n | 屏蔽模式空間的自動打印,否則每行處理結束會自動打印 |
-i | 在適當的位置修改文件(直接在文件中修改,慎用!!!) |
-r | 使用擴展正則表達式 |
-e | 多項操作 |
-f | 添加腳本文件內容到命令 |
定址查找
Shell> Seq 3| sed –n ‘2p’
2
##打印第2行
範圍查找
Shell> seq3 | sed –n ‘1,2p’
1
2
## 打印第1行到第2行
多項查找-e
Shell> seq 3 | sed –n –e ‘1p’ –e ‘3p’
1
3
##打印第1行和第3行
/…/查找內容,…查找值
Shell> seq 2 4 | sed –n ‘2,3p’
3
4
##打印第2行到第3行
Shell> seq 2 4 | sed –n ‘/2/,/3/p’
2
3
## 打印匹配2到匹配3的行之間的所有行內容
功能表
命令 | 功能 |
= | 打印當前行號 |
a\ | 在當前模式緩存後添加一行或多行。除最後一行外,每行末尾需用“\”續行 |
c\ | 替換當前模式緩存爲一行或多行文本。除最後一行外,每行末尾需用"\"續行 |
i\ | 在當前模式緩存前插入一行或多行。除最後一行外,每行末尾需用"\"續行 |
d | ***模式空間,開始下一個操作 |
h | 複製模式緩存到保留(暫時)緩存 |
H | 添加模式緩存到保留(暫時)緩存 |
g | 複製保留(暫時)緩存到模式緩存 |
G | 添加保留(暫時)緩存到模式緩存 |
l | 列出非打印字符 |
p | 打印當前模式緩存 |
n | 讀入下一行到模式緩存 |
N | 添加下一行到模式緩存 |
q | 結束或退出sed |
r | 從文件中讀取輸入文本 |
! | 對所選行以外的所有行應用命令 |
s | 用一個字符串替換另一個 |
g | 在行內進行全局替換 |
$ | 末尾行 |
w | 寫入當前模式空間到文件 |
W | 寫入當前模式空間的第一行到文件 |
x | 交換保留緩存和模式緩存的內容 |
y | 將字符替換爲另一字符(不能對正則表達式使用y命令) |
Addr,+N | 處理當前行直到當前行之後N行 |
Addr,~N | 處理當前行到第N行,等同於addr,N |
n~m | 從n行開始每m行匹配一次,sed –n ‘1~2p’奇數行打印 |
常用參數舉例
例:
添加行a
Shell> seq 3 | sed ‘/2/a\
>2+1\
>2+2’
1
2
2+1
2+2
3
## 在匹配2的行後面添加2+1,2+2
插入行i
Shell> seq 3 | sed ‘/2/i\
>3-1\
>3-2’
1
3-1
3-2
2
3
##在匹配2的行之前添加3-1,3-2
修改行c
Shell> seq 3 | sed ‘/2/ctwo’
1
two
3
##修改匹配2的行爲two
Shell> seq 3 | sed ‘/3/c\
>three\
>four’
1
2
three
four
##修改匹配3的行位three \n four
***行d
Shell> seq 3 | sed ‘/2/d’
1
3
## ***匹配2的行
列出打印行l(通常結合-n使用)
Shell> seq 3 | sed ‘/2/l’
2
2$
2
3
Shell> seq 3 | sed –n ‘/2/l’
2$
打印行p(通常結合-n使用)
Shell> seq 3 | sed ‘/2/p’
1
2
2
3
Shell> seq 3 | sed –n ‘/2/p’
2
結束和退出sed q(如果把sed比作一個循環,q就相當於break,-n結合d就相當於continue)
Shell> seq 3 | sed ‘/2/q’
1
2
選擇取反執行命令!
Shell> seq 3 | sed ‘/2/d’
1
3
Shell> seq 3 | sed ‘/2/!d’
2
用一個字符串替換一個字符串s
Shell> seq 3 | sed ‘s/2/two/’
1
two
3
全局替換g
Shell> seq 10 12 | sed ‘s/1/one/’
one0
one1
one2
Shell> seq 10 12 | sed ‘s/1/one/g’
one0
oneone
one2
行尾標識$
Shell> seq 10 12 | sed ‘s/1$/one/g’
10
1one
12
行首標識^
Shell> seq 10 12 | sed ‘s/^1/one/g’
One0
One1
One2
寫入當前模式空間內容到文件
Shell> seq 3 | sed –n ‘2wpp’
Shell> cat pp
2
轉換模式空間的字符爲另一個字符(y/source/dest/)
Shell> seq 212 214 | sed ‘y/1/a/’
2a2
2a3
2a4
對多個字符同時轉換(不能轉換字符串)
Shell> seq 212 214 | sed ‘y/12/IR/’
RIR
RI3
RI4
追加一個空行
Shell> seq 3 | sed ‘/2/G’
1
2
3
插入一個空行
Shell> seq 3 | sed ‘/2/{x;p;x}’
1
2
3
## 追加空行和添加空行都是利用了模式空間和暫存空間的原理來實現
n; addr,+n; addr,~n; n~m,幾個參數的應用
打印奇數行
Shell> seq 5 | sed ‘n;d’
1
3
5
Shell> seq 5 | sed ‘2~2d’
1
3
5
Shell> seq 5 | sed –n ‘1~1p’
1
3
5
模擬緩存和暫存緩存應用
模擬tac
Shell> seq 3 | sed ‘1!G;h;$!d’
3
2
1
模擬rev
Shell> echo `seq 3` | sed ‘/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//’
3 2 1
元字符
元字符 | 功能 | 示例 |
^ | 行首定位符 | /^my/ 匹配所有以my開頭的行 |
$ | 行尾定位符 | /my$/ 匹配所有以my結尾的行 |
. | 匹配除換行符以外的單個字符 | /m..y/ 匹配包含字母m,後跟兩個任意字符,再跟字母y的行 |
* | 匹配零個或多個前導字符 | /my*/ 匹配包含字母m,後跟零個或多個y字母的行 |
[] | 匹配指定字符組內的任一字符 | /[Mm]y/ 匹配包含My或my的行 |
[^] | 匹配不在指定字符組內的任一字符 | /[^Mm]y/ 匹配包含y,但y之前的那個字符不是M或m的行 |
\(..\) | 保存已匹配的字符 | 1,20s/\(you\)self/\1r/ 標記元字符之間的模式,並將其保存爲標籤1,之後可以使用\1來引用它。最多可以定義9個標籤,從左邊開始編號,最左邊的是第一個。此例中,對第1到第20行進行處理,you被保存爲標籤1,如果發現youself,則替換爲your。 |
& | 保存查找串以便在替換串中引用 | s/my/**&**/ 符號&代表查找串。my將被替換爲**my** |
\< | 詞首定位符 | /\<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的行 |
例:
匹配開頭^(既即行首字符)
Shell> swq 12 3 21
12
15
18
21
Shell> seq 12 3 21 | sed –n ‘/^2/p’
21
匹配結尾$(即行尾字符)
Shell> seq 12 3 21 | sed –n ‘/2$/p’
12
匹配一個字符.
Shell> seq 9 2 19
9
11
13
15
17
19
Shell> seq 9 2 19 | sed –n ‘/.9/p’
19
匹配0個或多個字符*
Shell> seq 11 13 | sed –n ‘/12*/p’
11
12
13
## 這個理解起來有些複雜,參考上例12*匹配的是包含1,12,122,1222…的所有字符,即匹配的是1後面跟0個或者多個2的字符竄
匹配指定字符的任意一個[]
Shell> seq 19 21 | sed –n ‘/[12][92]/p’
19
21
##上例匹配了11,19,21,29四個字符串
匹配指定字符以外的字符[^]
Shell> seq 3 | sed –n ‘/[^2]/p’
1
3
## ^是行首字符,結合[]使用就變成了取非效果,與shell正則表達相同
保存已經匹配的字符\(…\)
Shell> seq 19 21 | sed ‘s/2\(.\)/two\1/g’
19
two0
two1
## 替換2後面任意字符爲two後面任意字符
匹配查找的字符串&
Shell> seq 100 102 | sed ‘s/10[0-9]/&a/g’
100a
101a
102a
## 這裏&=10[0-9]
匹配單詞開頭\<
Shell> echo “109 901 910 102” | sed ‘’s/1/one/g
One09 90one 9one0 one02
Shell> echo “109 901 910 102” | sed ‘s/^1/one/g’
One09 901 910 102
Shell> echo “109 901 910 102” | sed ‘s/\<1/one/g’
One09 901 910 one02
## \<和^都是匹配開頭,不同的是\<分隔符是空格,TAB和換行,^分隔符是換行
匹配單詞結尾\>
Shell> echo “109 901 910 102” | sed ‘s/1\>/one/g’
109 90one 910 102
## 同上解
匹配M個相同字符a{m}
Shell> ifconfig | sed –n ‘/[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}/p’
Inet addr: 192.168.254.123 Bcast:192.168.254.255 Mask:255.255.255.0
##只有所有位都是3的地址是被匹配的
匹配M-N個相同字符a{n,m}
Shell> ifconfig |sed –n “/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/p”
Inet addr: 192.168.254.123 Bcast:192.168.254.255 Mask:255.255.255.0
Inet addr:127.0.0.1Mask:255.0.0.0
## 所有地址都被匹配
匹配大於等於N個相同字符a{n,}
Shell> ifconfig | sed –n ‘/[0-9]\{1,\}\. [0-9]\{1,\}\. [0-9]\{1,\}\. [0-9]\{1,\}/p’
Inet addr: 192.168.254.123 Bcast:192.168.254.255 Mask:255.255.255.0
Inet addr:127.0.0.1Mask:255.0.0.0
## 所有地址都被匹配
應用
替換my.cnf所有IP地址爲本地IP地址
Shell> mv /etc/mysql/my.cnf /etc/mysql/my.cnf.old;\
IP=`ifconfig | awk ‘{FS=”[ |:]+”} NR==2 {print $4}’`;\
sed “/bind-address/c\
bind-address\t\t\t\t= $IP” /etc/mysql/my.cnf.old> /etc/mysl/my.cnf
||
shell> IP=`ifconfig | awk ‘{FS=”[ |:]+” NR==2 {print $4}}’`;\
sed -i “/bind-address/c\
bind-address\t\t\t\t= $IP” my.cnf
## 推薦用第一種方法,雖然麻煩點,可以避免誤操作