sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法
6 o0 j g" O4 O3 r- c/ R2 Esed命令行格式为:
0 `' K9 n* x2 a4 Y6 i5 j& w sed [-nefri] ‘command’ 输入文本
常用选项:
/ Q1 x( X8 r7 v4 k -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
7 _$ G; q5 X! X& y1 Y8 d4 s" d" k4 m -e∶直接在指令列模式上进行 sed 的动作编辑;- |, X# u: U# L
-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;1 q- ]# B* Y+ d; s0 P# |+ x. |
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
: `2 `1 J& f% ?1 F! g -i∶直接修改读取的档案内容,而不是由萤幕输出。
常用命令:: R0 @9 Y8 g$ n0 `/ k- p+ V
a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
: q, O n* I, U c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- G2 |3 E7 g' Y% e/ C d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
. g) x* p7 ^* L8 G5 u" d i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);/ h& t. v* t- o0 Q2 q
p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
% C% \) ?0 `8 G+ e* V" T2 M3 u s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
举例:(假设我们有一文件名为ab)( N- d2 F5 X- r
删除某行" n- n% Q+ `: Q
[root@localhost ruby] # sed '1d' ab #删除第一行 6 P" w. L6 W% K1 q9 R
[root@localhost ruby] # sed '$d' ab #删除最后一行+ E$ l& K0 x0 x6 M) j
[root@localhost ruby] # sed '1,2d' ab #删除第一行到第二行/ d, y" U; K) q% E
[root@localhost ruby] # sed '2,$d' ab #删除第二行到最后一行
显示某行
: g7 n& ~4 N2 S: ~, x. K. T* t. [root@localhost ruby] # sed -n '1p' ab #显示第一行
+ }$ ]9 v# B4 ~# h ?9 _) f' ^; U! P [root@localhost ruby] # sed -n '$p' ab #显示最后一行, ~, V$ i- T% l- Q2 a& H
[root@localhost ruby] # sed -n '1,2p' ab #显示第一行到第二行
% ~( [- r9 {+ L [root@localhost ruby] # sed -n '2,$p' ab #显示第二行到最后一行
使用模式进行查询9 w. \) `2 g( ^! T4 J) b
[root@localhost ruby] # sed -n '/ruby/p' ab #查询包括关键字ruby所在所有行
, S( i) m* X8 P; {) ?7 q [root@localhost ruby] # sed -n '/\$/p' ab #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义
增加一行或多行字符串
& X: G* q/ q' Z) k [root@localhost ruby]# cat ab
% ^5 W% X: X( d: U3 [- e Hello!
, V+ @2 b; x9 U- Q( Y ruby is me,welcome to my blog./ h. O' Q X& O" c
end! u3 i# ~/ S2 o; @" k; X w' h. d
[root@localhost ruby] # sed '1a drink tea' ab #第一行后增加字符串"drink tea"
5 M2 S% M* E! i. e( f Hello!; E7 j( G& |$ C
drink tea1 a* o! G+ J7 W
ruby is me,welcome to my blog. $ c2 ^$ ?! X7 k. k# }+ o/ ~8 N; a
end( K2 R7 W* R- k4 k" D
[root@localhost ruby] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"
7 `+ R( H6 N* q Hello!
5 @7 ?) h% \( W4 |2 V drink tea& C& D5 H$ z/ P! {0 e6 z
ruby is me,welcome to my blog.
$ s, Y2 {- n# M. u4 O# S0 _ drink tea
7 u6 x% u7 n; ~/ k4 m3 g end5 G" `6 _9 s) u' @2 Y. e% k
drink tea- _* V8 z4 D& x3 ]3 ^. K& P
[root@localhost ruby] # sed '1a drink tea\nor coffee' ab #第一行后增加多行,使用换行符\n
& r2 T% O+ m6 x$ a- \$ @ Hello!& p+ `% L. Z* r$ p9 C/ h
drink tea
* U q6 I T6 c \1 w, H1 L$ H' ~ or coffee1 y. N1 I# }7 a9 Q. s5 a
ruby is me,welcome to my blog.5 ?# c. k* N7 b# `, L$ ^5 q2 ~
end
代替一行或多行: D: Z+ j0 Y! Z( J& I
[root@localhost ruby] # sed '1c Hi' ab #第一行代替为Hi
3 ?+ m/ b( F7 U! f/ B0 Q! K Hi& ?6 X7 v3 ]) t9 V; G
ruby is me,welcome to my blog.- F! v' |* w2 c( K7 Q: P1 C% T# ~
end1 o: f, ?) P( z& R8 R- _; O2 o
[root@localhost ruby] # sed '1,2c Hi' ab #第一行到第二行代替为Hi( ~/ V( _- s% z2 r6 f1 g8 K# t( a2 V3 Y
Hi
a$ d/ M6 U5 s2 ]* @ end
替换一行中的某部分+ |6 Q9 V9 n8 M6 r y
格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串可以用正则表达式)
+ n. u) h; ]2 E0 G. v8 d [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g' #替换ruby为bird
% [4 a5 K1 [! ]& m: E+ K/ u [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g' #删除ruby
插入
) c. t/ U& g0 V+ L [root@localhost ruby] # sed -i '$a bye' ab #在文件ab中最后一行直接输入"bye"' w: {' b( A# z7 |% v
[root@localhost ruby]# cat ab
8 m' o8 }% P! O, q Hello!
0 s3 y) N9 l- X2 w$ g2 j; v8 t( { ruby is me,welcome to my blog.4 n8 r+ X3 O: G3 s; w% X% g
end# Z! K; F' [8 k: P6 B$ t
bye
删除匹配行
sed -i '/匹配字符串/d' filename (注:若匹配字符串是变量,则需要“”,而不是‘’。记得好像是)
替换匹配行中的某个字符串
sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename
, w$ f0 k: |; E+ l$ F( y7 Z! g