设为首页收藏本站
开启辅助访问
切换到窄版

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1674|回复: 1

SED 使用总结

[复制链接]
发表于 2012-5-16 10:16:43 | 显示全部楼层 |阅读模式
原文地址:http://clayboy1.bokee.com/2924069.html

SED
使用总结
. 简介
不同于一般的交互式编辑器( Vi等), SED (Stream Editor)是一个逐行读入数据,进行处理后再输出到标准输出的非交互式编辑器.
优点是: 流编辑, 方便地从管道(Pipe line)读入文字, 进行文字自动编辑处理.
用途包括:
1). 对文档进行批量编辑工作: 可以利用SED命令对文件进行删除,插入,
修改等编辑. 由于是自动完成的,所以可以对一批文件重复操作,提高效率.
2). 对程序中间过程进行编辑处理: 借助管道, 自动处理中间结果.
注意: SED只对输入处理,并在标准输出上输出,不改变原有文件内容,如果想报存结果要用重定向命令.
    SED工作基本原理:
      当 sed 由标准输入读入一行资料并放入 pattern space 时 , sed 依照 sed script 的编辑指令逐一对 pattern space 内的资料执行编辑 , 之後 , 再由 pattern space 内的结果送到标准输出 , 接着再将下一行资料读入。如此重执行上述动作 , 直至读完所有资料行为止. 另外,SED还有一hold space可以作为暂时的文本保存区,跟pattern space进行交互.


二. 基本使用
1. SED命令的格式:
sed [-n] [-e ‘script’] [-f script_file] file

-n : no printing, 不输出, 除非遇到对该行的指定输出命令(/p).
如无该参数, 默认逐行输出处理结果到STDOUT.
-e : 后跟sed编辑指令
-f : 后跟script file, 将sed script从一个文件中取得
file : 待处理的文件, 被逐行读出, 处理, 输出到STDOUT, 本身不变. 可以用重定向的方式输出为文件.


2. SED script编辑指令的格式:
[address [,address]] command [argument]

address: 行数, 可以有0,1,2个地址参数, 表明命令作用于全部行,
某一行, 或者是某几连续行. 也可以是正则表达式
command: 命令, 表明进行的操作
argument: 该命令对应的参数, 只有替换命令(s)可以带参数


3. SED command 种类:
1). 处理整行的command:

Command



功能



地址参数

可能个数



说明



d



删除一行



0,1,2



将匹配的该行文字删除, 不输出



n



读入下一行



0,1,2



将匹配行文字输出,从输入读入下一行文字, 继续执行下一个指令



a\



加入文字



0,1



将文字加入到匹配行文字后输出



i\



插入文字



0,1



将文字插入到匹配行文字前输出



c\



替换文字



0,1,2



将文字替换匹配行文字进行输出













2). 替换或转换命令(Substitute, transform):

Command



功能



说明



s



模式替换



找到匹配行, 进行替换操作



y



子元转换



找到匹配行, 进行子元转换




s命令: sed中唯一的带参数的命令, 可以有4种参数:
g参数, 在该行中, 替换所以匹配而不是只替换第一次匹配
n 参数, 在该行中, 替换第n个匹配
p参数, 对该行执行替换, 并输出该行文字
w filename 参数, 将替换后的该行写入filename文件中
如, /UNIX/s/OK/YES/g, 含UNIX的行, 所有OK->YES
该命令内嵌入vi编辑器中.
y命令: 该行中所有对应子元进行转换.
如, 1,5y/abc/edf/, 所以1到5行所有子元: a->e, b->d, c->f 转换
3). 输入输出命令:

Command



功能



地址参数

可能个数



说明



p



送至输出



0,1,2



遇匹配行时, 输出pattern space 内容



l



送至输出



0,1,2



与p类似,不同的是将键盘上无法输出的字符用8进制输出,超过72个字长的部分移到下一行



w filename



写入文件



0,1,2



将匹配行文字写入文件filename中



r filename



从文件读入



0,1,2



对匹配行,用filename中的文字输出


*SED将内部分为pattern space(工作区)和hold space(暂存区)

4). 多行处理命令:
通常sed一次处理一行文字, 这些命令赋予多行处理能力


Command



功能



地址参数

可能个数



说明



N



Next line



0,1,2



与匹配行时,再读入下一行,加在当前pattern space文字的后面



D



Delete first part of pattern space



NO address



将pattern space第一个new line字母前的文字删去,仅一个newline字母时,相当于d 命令



P



Print first part

of pattern space



NO address



将pattern space第一个new line字母前的文字输出



5). 存取暂存区的命令:
pattern space与hold space文字的交互



Command



功能



地址参数

可能个数



说明



h



pattern space拷贝到hold space



0,1,2



将pattern space内容拷贝到hold space



H



pattern space 加到hold space



0,1,2



将pattern space内容加到hold space后



g



h反方向



0,1,2



将hold space内容拷贝到pattern space



G



H反方向



0,1,2



将hold space内容加到pattern space后



x



交互两个space




将pattern space与hold space内容交换



6). 执行流程控制命令:

Command



功能



地址参数

可能个数



说明



!



Dont



0,1,2



对匹配行以外的内容执行命令



{}



Group command



没有



对匹配行执行多个命令,这些命令用{}包含



:label




0,1,2



定义给命令用的label



b label




0,1,2



遇匹配时,跳到label,继续执行下命令



t label





遇匹配时,先执行一替换命令,成功则同b, 否则继续执行一命令




7). 其他命令:

Command



功能



地址参数

可能个数



说明



=



Line number



1



将匹配行的行数输出



q



Quit



1



遇到匹配时,结束sed




三. 常用操作举例

1. 将文件中所以小写变大写:y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
2. 将包含"ERROR"的行, 替换为"This line has error"
sed -f script.sed file1 > file2
script.sed 内容:
/ERROR/c\
This line has error
3. 部分行的输出与删除
注意: SED本身不改变原文件内容, 删除仅指不输出该部分,重定向输出为文件时,与原文件比为删除
sed -n '2,5p' file1 : 仅输出文件file1的2-5行
sed -e '2,5d' file1 : 将文件file1的2-5行删除
sed -e '/^#/d' file1 : 将文件file1的以#开头的行删除
sed -ne '/HELLO/p' file1 : 仅输出file1中含HELLO的行
sed -ne '/BEGIN/,/END/p' file1 : 仅输出file1中BEGIN与END间的部分
首先,匹配含BEGIN的行作为块首, 然后向后以第一次匹配的含END的行为块尾,输出该块各行
如果, 没有匹配到BEGIN,则不输出; 如果只匹配到BEGIN,则输出从该行到文件尾的各行
在匹配到BEGIN的行后面,匹配到END的前面含有的BEGIN当作一般行,仍以第一个BEGIN为块首
一个文件中, 可能有好几个这样匹配的区域块,都要输出

4. 替换操作
sed -e 's/foo/bar/' file1 : 将file1中第一次出现的foo替换为bar
sed -e 's/foo/bar/g' file1 : 将file1中所有的foo替换为bar
sed -e '1,8s/foo/bar/g' file1 : 将file1的1-8行中所以的foo替换为bar
sed -e '/^$/,/^END/s/foo/bar/g' file1
首先匹配以空行为块首,END为行首的行为块尾的所有区域块,
然后将在这些区域块中出现的foo替换为bar
sed -e 's/<.*>//g' file1 : 将file1各行中,<>间的文字删除(最大)
is what meant ===> meant
sed -e 's/<[^>]*.//g' file1 : 将file1各行中,<>间的文字删除(最小)
is what meant ===> is what meant
注意: .*表示任意格式的任意字符 [^>]*表示任意个数的非>的字符
sed -e 's/girl/nice & hello/g' file1 : 将file1各行中的girl替换为nice girl hello
这里&表示前面匹配的内容,在要替换的文字里引用
更强的引用: 在匹配文字中用\(\)包含文字,在匹配文字中用\1到\9来引用
sed -e 's/\(boy\) loves \(girl\)/\2 A loves \1 B/g' file1
boy loves girl ===> girl A loves boy B'

5.对同一对象执行多个sed操作时的3种方法
1). sed -e 'command1;command2;command3' file1
三个sed命令依次作用到file1的各行
2). sed -e 'command1' -e 'command2 file1
跟1)类似,比1)跟保险,1)不能用的时候可以尝试
3). sed -f script_file file1
一些复杂命令,必须写到一个script 文件中
 楼主| 发表于 2012-5-16 14:34:41 | 显示全部楼层
nis20
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|手机版|Archiver|生物信息学论坛 ( 蜀ICP备09031721号  

GMT+8, 2017-1-19 04:27 , Processed in 0.110535 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表