Chinaunix首页 | 论坛 | 博客
  • 博客访问: 627543
  • 博文数量: 138
  • 博客积分: 3067
  • 博客等级: 中校
  • 技术积分: 1565
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-21 12:44
文章分类

全部博文(138)

文章存档

2016年(5)

2014年(4)

2012年(1)

2011年(2)

2010年(10)

2009年(19)

2008年(97)

我的朋友
sed

分类: LINUX

2008-08-13 14:32:11


################################################################
#[0]:  基础                                                    #
################################################################
**sed执行过程:
  a. 如果已到达文件尾,goto e;否则,用当前行内容替换模式空间的内容(即缓冲区,还有一个缓冲区:后备空间);
  b. 执行命令序列,命令只对模式空间有效;
  c. 当前行号加1
  d. goto a;
  e. 退出
注: 当前行号可由命令N或n更改,当前行号最初为第1行
   执行命令时,如果该命令有地址前缀,那么看*当前行号*是否与地址前缀相符,相符则执行,否则不执行


例子:
$sed -e 'p;p;i
my-inserted-text
p;
a
my-appended-text
p;' filename
这个例子中有6条命令:4个p命令,1个i命令,1个a命令;
$sed -e '2p;3,5p;6~10i
my-inserted-text
p;
7a
my-appended-text
/AA/p;' filename
这个例子类似上个,仅加入了地址前缀
((详情请参考下文))

**常用方法:
命令:
sed 'commands' targetfile
echo "string" |sed 'commands'
脚本:
#!/bin/sed -f
command1
command2
...

**选项:
-V
--version
         提示版本信息
-h
--help
         提示帮助信息
-n
--quite
--silent
         默认情形,sed在执行完用户提交的命令列表后,会执行p命令,这3个选项能屏蔽这个默认功能
-e
--exception=script
         增加script命令列表到当前命令列表
-f
--file=script-file
         增加script-file文件内的命令列表到当前命令列表
初始时,当前命令列表为空;如果没有-e,--exception,-f,--file选项,那么命令行的第一个非选项参数被
当作命令列表添加到当前命令列表中


**常见命令:
可带范围地址前缀的命令(11个):
d         删除模式空间的内容,goto c
D         删除模式空间内的第一行,如果模式空间内还有内容,goto b,否则,goto c
p         将模式空间中的内容输出到标准输出
P         将模式空间中的第一行内容输出到标准输出
N         读入下一行,将其*追加*到模式空间尾,当前行号加1,如果没有可读的行了,goto e
n         读入下一行,用它*替换*模式空间内容,当前行好加1,如果没有可读的行了,goto e
h         用模式空间内容*替换*后备空间内容
H         将模式空键内容*追加*到后备空间尾
g/G       同h/H,但方向相反,后备空间->模式空间
x         交换模式空间和后备空间内容
l         输出模式空间内容到标准输出,以更人性话的方式输出
         例子:
         $echo -ne "AA BBBB CCCDDDD FDSAFDSA "|sed -n 'l'
         AA BBBB$
         CCCDDDD$
         FDSAFDSA$
{         命令块的开始,以 } 结束
b label   跳转到标签label处,如同c语言的goto语句
t label   从最近一次从标准输入读入一行开始 到 现在,如果执行了替换命令,且替换成功了,
         那么跳转到label处,继续执行;否则执行下一条命令.
         相当于条件跳转
s/regexp/replacement/
         对模式空间内容进行替换,只替换与regexp匹配的部分;
         只对第一次匹配的进行替换
s/regexp/replacement/g
         对模式空间内容          对模式空间内容进行全局替换
y/source/dest/
         逐个字符替换,其中source的长度必须与dest相等
         如:source为ABC,dest为abc,那么模式空间内的所有A字符被换成a,B换成b,C换成c
         以最后一对替换为标准,
         如:source为ABA,dest为abc,那么模式空间内的所有A字符被换成c(而不是a),B换成b
         例子:
         $echo ABCD |sed -n 'y/ABA/abc/;p'
         cbCD
w file    把模式空间的内容写到file文件内
         sed在它开始执行前,如果在当前命令序列中发现了这条命令,先将文件file清空(如果存在的话;不存在则创建),
         之后所有的写入都是被追加到文件file尾

不带地址前缀的命令(3个):
#comments 注释
: label   设置标签
}         与}匹配

最多能带一个地址的命令(5个):
=         输出当前行号到标准输出
a
text      执行完所有命令后,输出text到标准输出
i
text      输出text到标准输出
q         如果没有 -n 选项,则goto e;否则,先输出模式空间内容到标准输出,然后goto e;
r file    file表示一个文件,如果这是最后一条命令,则输出文件file的内容到标准输出,然后goto c;
         否则,goto c;

**地址格式(数字代表行号,从1开始):
例子:
单地址:   1   第一行
         /string/   与string匹配的行
         $   最后一行
范围地址: 单地址,单地址
         例子:
         1,2     或     1~2
         1,$  所有行
多行:     /regexp/      代表与正则表达式regexp匹配的行
         cregexpc     代表与正则表达式regexp匹配的行,其中c可为任意字符

**带地址前缀的命令:
例子:
1p
1,3p    或     1~3p

################################################################
#[1]:  元字符 * + ? { } ( )                                    #
################################################################
* 在当前模式内*前有匹配字符时,表示个数(>=0个);
例子:
$echo 'aaabbbbcdddd' |sed 's/(a*)/|1|/'
|aaa|bbbbcdddd

* 在当前模式内*前无匹配字符时,表示字符'*';
例子:
$echo 'a*abbbbcdddd' |sed 's/a(*)/|1|/'
|*|abbbbcdddd
$echo 'a*abbbbcdddd' |sed 's/*/|z|/'
a|z|abbbbcdddd

* 表示字符'*';
例子:
$echo 'a*abbbbcdddd' |sed 's/(a*)/|1|/'
|a*|abbbbcdddd

? 表示字符'?';
例子:
$echo 'a?abbbbcdddd' |sed 's/?/|z|/'
a|z|abbbbcdddd

? 在当前模式内?前有匹配字符时,表示个数(0或者1个);
例子:
$echo 'aa?bbbbcdddd' |sed 's/(a?)/|1|/'
|a|a?bbbbcdddd

? 在当前模式内?前无匹配字符时,表示字符'?';
例子:
$echo 'aa?bbbbcdddd' |sed 's/(?)/|1|/'
aa|?|bbbbcdddd

+ + 的意义类似 ? ?,只不过表示数字时为>=1个

{ 表示字符'{'
} 表示字符'}'

{ } 用于表示出现次数,出现{时,必须出现}.
单个}出现时,表示字符'}'
例子:
$echo '({(aabbb}d' |sed 's/b{1,}}/|z|/'
({(aa|z|d
成对{ }的3种格式: {1}   {1,}   {1,9}, 如上例

( 表示字符'('
) 表示字符')'

( ) 必须成对出现,表示子模式
例子:
$echo 'a*abbbbcdddd' |sed 's/(a*)/|1|/'
|a*|abbbbcdddd

阅读(720) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~