sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法
8 c# @! M0 ~5 fsed命令行格式为:5 q6 y# {6 d) I8 u0 v2 B, p* G
sed [-nefri] ‘command’ 输入文本
常用选项:& R t6 Q- ~) k7 g$ Z% M5 M
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
+ W F/ l" C' W9 E- ?! x( a: s -e∶直接在指令列模式上进行 sed 的动作编辑;
' Y# Z' {/ {; n- B& g2 w, W -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
+ _9 D5 {' {& L9 w% ~ -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)- J4 n0 x+ y7 [% }
-i∶直接修改读取的档案内容,而不是由萤幕输出。
常用命令:
7 B! z7 V* d4 _$ ~4 A" m a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~3 y0 `0 ~7 P0 T
c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!+ e+ S& T% o6 N7 Y4 H* I
d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
b! r5 J- u$ {/ h i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
) a& ~. R; `; C3 u p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~" p& H7 Y7 D: W- n
s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
举例:(假设我们有一文件名为ab)3 d, D( r$ y* g/ d' p
删除某行: n3 @7 r/ Z9 P& z# ~
[root@localhost ruby] # sed '1d' ab #删除第一行
) k; p7 j/ D& x; D6 H [root@localhost ruby] # sed '$d' ab #删除最后一行
7 J, r. J! s0 o. R) j [root@localhost ruby] # sed '1,2d' ab #删除第一行到第二行! F/ p* m4 ~* [# B+ w
[root@localhost ruby] # sed '2,$d' ab #删除第二行到最后一行
显示某行
; W! e, [9 y j. [root@localhost ruby] # sed -n '1p' ab #显示第一行
, X, K1 V, ^! _2 m% X [root@localhost ruby] # sed -n '$p' ab #显示最后一行$ {. n6 v! d2 ?( R( C
[root@localhost ruby] # sed -n '1,2p' ab #显示第一行到第二行2 v `# u( k$ [
[root@localhost ruby] # sed -n '2,$p' ab #显示第二行到最后一行
使用模式进行查询6 P. `* ?6 A& q4 @
[root@localhost ruby] # sed -n '/ruby/p' ab #查询包括关键字ruby所在所有行' i1 W/ l" Y/ r9 F
[root@localhost ruby] # sed -n '/\$/p' ab #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义
增加一行或多行字符串
( k6 L3 w! T' h7 M2 B) `& S [root@localhost ruby]# cat ab
2 M* i1 v# Z/ ]) w, ]5 @ Hello!: c) |+ A; T9 ~
ruby is me,welcome to my blog.
0 X7 C4 i; V! z* }2 B0 ] end
2 F+ M; x' z: `+ K, L# Z0 @; I [root@localhost ruby] # sed '1a drink tea' ab #第一行后增加字符串"drink tea"
( a8 a% A+ W5 Y Hello!6 _3 o9 M" D9 G: h
drink tea2 p9 R+ O5 L' p* j) E9 z. j' B. \# z
ruby is me,welcome to my blog. 8 _% L$ [- t3 J3 J' w; T8 l c: C
end o0 ^6 D9 S! v9 w5 j F' W
[root@localhost ruby] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"0 @1 h* `& S0 @) X& f
Hello!
; L- u0 {0 i3 z. m' C' I drink tea# l" N- [5 l, l7 X
ruby is me,welcome to my blog.) C$ P! F9 s, g' \
drink tea
/ d7 G% X0 q2 V& r9 h" M w) b- I end
% K( B' a; T+ Q; n* p) _ drink tea
: _. J$ x, i1 V1 R [root@localhost ruby] # sed '1a drink tea\nor coffee' ab #第一行后增加多行,使用换行符\n |) }2 s d- N) w& L+ A. b- W( o
Hello!
' M$ q7 P8 u& I; N* M# \: G9 [! A drink tea: n. y9 S0 z: r* a8 V2 W% v" M
or coffee
% F- v2 q4 ^& q4 b7 h ruby is me,welcome to my blog.
9 Z' |2 u2 j: e1 N end
代替一行或多行8 a6 Y$ d& v' p* _+ W) E
[root@localhost ruby] # sed '1c Hi' ab #第一行代替为Hi9 S6 B/ q* }$ F& m3 f, w
Hi% p% @) V+ U% b8 v/ x' D
ruby is me,welcome to my blog.& r3 B. \, V% f1 ~6 e# O0 N' y) ?
end
. e( L8 k: J8 j2 n5 c, k [root@localhost ruby] # sed '1,2c Hi' ab #第一行到第二行代替为Hi6 y3 G5 l/ R( \; c0 G1 }
Hi
) p+ F8 J e( G, X4 W end
替换一行中的某部分
+ v, f- ?7 h' \) g; L% c 格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串可以用正则表达式): H6 p7 b' Z' x% X7 ^
[root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g' #替换ruby为bird" q" L4 A4 l% y4 g
[root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g' #删除ruby
插入
- D) _/ E) B; I; Q2 b- Z [root@localhost ruby] # sed -i '$a bye' ab #在文件ab中最后一行直接输入"bye"4 m k0 m5 {% B' d
[root@localhost ruby]# cat ab
9 T) v' U0 V. W0 K6 U Hello!
3 q" S8 J/ L6 b# M& U. y! _ ruby is me,welcome to my blog., S$ _9 b0 Q+ [) W8 J
end t2 W, P# M# k! J
bye
删除匹配行
sed -i '/匹配字符串/d' filename (注:若匹配字符串是变量,则需要“”,而不是‘’。记得好像是)
替换匹配行中的某个字符串
sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename
5 D0 U/ t: ]# [6 q' j' s