shell sed實例詳解
一、sed (Stream Editor)
1、定位行:
sed -n '12,~3p' pass #從第12行開始,直到下一個3的倍數(shù)行(12-15行)
sed -n '12,+4p' pass #從第12行開始,連續(xù)4行(12-16行)
sed -n '12~3p' pass #從第12行開始,間隔3行輸出一次(12,15,18,21...)
sed -n '10,$p' pass #從第10行至結(jié)尾
sed -n '4!p' pass #除去第4行
2、正則:'/正則式/'
sed -n '/root/p' /etc/passwd
sed -n '/^root/p' /etc/passwd
sed -n '/bash$/p' /etc/passwd
sed -n '/ro.t/p' /etc/passwd
sed -n '/ro*/p' /etc/passwd
sed -n '/[ABC]/p' /etc/passwd
sed -n '/[A-Z]/p' /etc/passwd
sed -n '/[^ABC]/p' /etc/passwd
sed -n '/^[^ABC]/p' /etc/passwd
sed -n '/\<root/p' /etc/passwd
sed -n '/root\>/p' /etc/passwd
3、擴展正則:
sed -n '/root\|yerik/p' /etc/passwd #拓展正則需要轉(zhuǎn)義
sed -nr '/root|yerik/p' /etc/passwd #加-r參數(shù)支持拓展正則
sed -nr '/ro(ot|ye)rik/p' /etc/passwd #匹配rootrik和royerik單詞
sed -nr '/ro?t/p' /etc/passwd #?匹配0-1次前導字符
sed -nr '/ro+t/p' /etc/passwd #匹配1-n次前導字符
sed -nr '/ro{2}t/p' /etc/passwd #匹配2次前導字符
sed -nr '/ro{2,}t/p' /etc/passwd #匹配多于2次前導字符
sed -nr '/ro{2,4}t/p' /etc/passwd #匹配2-4次前導字符
sed -nr '/(root)*/p' /etc/passwd #匹配0-n次前導單詞
4、sed編輯(對行的插入、刪除、替換操作)
sed '/root/a admin' /etc/passwd #在root行后追加一個admin行
sed '/root/i admin' /etc/passwd #在root行前插入一個admin
sed '/root/c admin' /etc/passwd #將root行替換為admin
sed '/root/d' /etc/passwd #刪除含有root的行
s替換
sed -n 's/root/admin/p' /etc/passwd
sed -n 's/root/admin/2p' /etc/passwd #在每行的第2個root作替換
sed -n 's/root/admin/gp' /etc/passwd
sed -n '1,10 s/root/admin/gp' /etc/passwd
sed -n 's/root/AAA&BBB/2p' /etc/passwd #將root替換成AAArootBBB,&作反向引用,代替前面的匹配項
sed -ne 's/root/AAA&BBB/' -ne 's/bash/AAA&BBB/p' /etc/passwd #-e將多個命令連接起來,將root或bash行作替換
sed -n 's/root/AAA&BBB/;s/bash/AAA&BBB/p' /etc/passwd #與上命令功能相同
sed -nr 's/(root)(.*)(bash)/\3\2\1/p' /etc/passwd #將root與bash位置替換,兩標記替換
或sed -n 's/\(root\)\(.*\)\(bash\)/\3\2\1/p' /etc/passwd
bash:x:0:0:root:/root:/bin/root
y替換
echo "sorry"|sed 'y/ory/ABC/' #一一對應替換(sABBC)
6、sed的模式空間和保持空間
h:模式---->保持
H:模式--->>保持
x:模式<--->保持
g:保持---->模式
G:保持--->>模式
例如:
111
222
333
444
# sed '1h;2,3H;4G'
分析
CMD 模式 保持
111 111 \n
1h 111 111
----------->111
222 222 111
2,3H 222 111\n222
----------->222
333 333 111\n222
2,3H 333 111\n222\n333
----------->333
444 444 111\n222\n333
4G 444\n111\n222\n333
----------->444\n111\n222\n333
1-10
11-22
22-33
11-22
34-END
7、sed特殊用法
sed -n '/root/w a.txt' #將匹配行輸出到文件
sed '/root/r abc.txt' /etc/passwd #把abc.txt的文件內(nèi)容讀入到root匹配行后
sed -n '/root/w a.txt'
sed -n '/root/{=;p}' /etc/passwd #打印行號和匹配root的行
sed -n '/root/{n;d}' /etc/passwd #將匹配root行的下一行刪除
sed -n '/root/{N;d}' /etc/passwd #將匹配root行和下一行都刪除
sed '22{h;d};23,33{H;d};44G' pass
8、sed 腳本編寫方法
<1>從文件讀入命令
sed -f sed.sh
sed.sh文件內(nèi)容:
s/root/yerik/p
s/bash/csh/p
<2>直接運行腳本 ./sed.sh /etc/passwd
#!/bib/sed -f
s/root/yerik/p
s/bash/csh/p
###################################
二、Sed練習
1,刪除文件每行的第一個字符。
sed -n 's/^.//gp' /etc/passwd
sed -nr 's/(.)(.*)/\2/p' /etc/passwd
2,刪除文件每行的第二個字符。
sed -nr 's/(.)(.)(.*)/\1\3/p' /etc/passwd
3,刪除文件每行的最后一個字符。
sed -nr 's/.$//p' /etc/passwd
sed -nr 's/(.*)(.)/\1/p' /etc/passwd
4,刪除文件每行的倒數(shù)第二個字符。
sed -nr 's/(.*)(.)(.)/\1\3/p' /etc/passwd
5,刪除文件每行的第二個單詞。
sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\1\2\3\5/p' /etc/passwd
6,刪除文件每行的倒數(shù)第二個單詞。
sed -nr 's/(.*)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]*)/\1\2\4\5\6/p' /etc/samba/smb.conf
7,刪除文件每行的最后一個單詞。
sed -nr 's/(.*)([^a-Z]+)([a-Z]+)([^a-Z]*)/\1\2\4/p' /etc/samba/smb.conf
8,交換每行的第一個字符和第二個字符。
sed -nr 's/(.)(.)(.*)/\2\1\3/p' /etc/passwd
9,交換每行的第一個單詞和第二個單詞。
sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\1\4\3\2\5/p' /etc/samba/smb.conf
10,交換每行的第一個單詞和最后一個單詞。
sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\1\4\3\2\5/p' /etc/passwd
11,刪除一個文件中所有的數(shù)字。
sed 's/[0-9]*//g' /etc/passwd
12,刪除每行開頭的所有空格。
sed -n 's/^\ *//p' /etc/samba/smb.conf
sed -nr 's/( *)(.*)/\2/p' testp
13,用制表符替換文件中出現(xiàn)的所有空格。
sed -n 's/\ /\t/gp' pass
14,把所有大寫字母用括號()括起來。
sed -nr 's/([A-Z])/(&)/gp' testp
sed -n 's/[A-Z]/(&)/gp' testp
15,打印每行3次。
sed 'p;p' pass
16,隔行刪除。
sed -n '1~2p' pass
17,把文件從第22行到第33行復制到第44行后面。
sed '1,21h;22h;23,33H;44G' pass
18,把文件從第22行到第33行移動到第44行后面。
sed '22{h;d};23,33{H;d};44G' pass
19,只顯示每行的第一個單詞。
sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)(.*)/\2/p' /etc/passwd
20,打印每行的第一個單詞和第三個單詞。
sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\2--\4/p' /etc/passwd
21,將格式為 mm/yy/dd 的日期格式換成 mm;yy;dd
date +%m/%Y/%d |sed -n 's#/#;#gp'
22, 逆向輸出
cat a.txt
ABC
DEF
XYZ
輸出樣式變成
XYZ
DEF
ABC