sed总结
发表于:2007-05-26来源:作者:点击数:
标签:
################################################################ #[0]:基础# ################################################################ **sed执行过程: a.如果已到达文件尾,gotoe;否则,用当前行内容替换模式空间的内容(即缓冲区,还有一个缓冲
################################################################
#[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
''' filename
这个例子中有6条命令:4个p命令,1个i命令,1个a命令;
$sed -e&nbs'''2p;3,5p;6~10i \
my-inserted-text
p;
7a \
my-appended-text
/Ap''' filename
这个例子类似上个,仅加入了地址前缀
((详情请参考下文))
**常用方法:
命令:
sed&np'''commd''' targetfile
echo "string" |sed&np'''commd'''
脚本:
#!/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\n
CCCDDDD\nFDSAFDSA\n"|sed -n&np'''''
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&np'''y/ABA/ab;'''
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]: 元字符 * + ? { } ( ) <t; > #
################################################################
* 在当前模式内*前有匹配字符时,表示个数(>=0个);
例子:
$echobp''''aaabbbdd'''' |sedbp''''s/\(a*\)\|''''
|aaa|bbbbcdddd
* 在当前模式内*前无匹配字时示'''''';
例子:
$echobp''''a*abbbdd'''' |sedbp''''s/a\(*\)\|''''
|*|abbbbcdddd
$echobp''''a*abbbdd'''' |sedbp''''s/||''''
a|z|abbbbcdddd
\*&nbp示'''''';
例子:
$echobp''''a*abbbdd'''' |sedbp''''s/\(a\*\)\|''''
|a*|abbbbcdddd
?&nbp示'''''';
例子:
$echobp''''a?abbbdd'''' |sedbp''''s/||''''
a|z|abbbbcdddd
\? 在当前模式内?前有匹配字符时,表示个数(0或者1个);
例子:
$echobp''''aa?bbbdd'''' |sedbp''''s/\(a\?\)\|''''
|a|a?bbbbcdddd
\? 在当前模式内?前无匹配字时示'''''';
例子:
$echobp''''aa?bbbdd'''' |sedbp''''s/\(\?\)\|''''
aa|?|bbbbcdddd
+ \+ 的意义类似 ? \?,只不过表示数字时为>=1个
{&nbp示''''''
}&nbp示''''''
\{ \} 用于表示出现次数,出现\{时,必须出现\}.
单个\}出时示''''''
例子:
$echobp''''({(ab}'''' |sedbp''''s/b\{1,\}\||''''
({(aa|z|d
成对\{ \}的3种格式: \{1\} \{1,\} \{1,9\}, 如上例
(&nbp示''''''
)&nbp示''''''
\( \) 必须成对出现,表示子模式
例子:
$echobp''''a*abbbdd'''' *abbbdd'''' |sedbp''''s/\(a\*\)\|''''
|a*|abbbbcdddd
\< \> 表示完全匹配一个单词
[zbr>[zleil@ZLEIL shApp]$ echo "abc" | sedbp''''/b/s/\<ab\>A/''''
abc
[zleil@ZLEIL shApp]$ echo "ab c" | sedbp''''/b/s/\<ab\>A/''''
AB c
< > 表示普通字符 < >
**关于label的例子
这有几个关于label的例子,
[zleil@ZLEIL shApp]$ echo "aBBbc" | sed -nbp''''p;b label;p;:le;'''';
aBBbc
aBBbc
[zleil@ZLEIL shApp]$ echo "aBBbc" | sed -nbp''''s/B/k/;t label;p;:le;'''';
akBbc
[zleil@ZLEIL shApp]$ echo "aBBbc" | sed -nbp''''s/D/k/;t label;p;:le;'''';
aBBbc
aBBbc
寂寞烈火 回复于:2005-05-30 19:27:31
|
不错~~~ :mrgreen:
PS:我遇到sed的问题,一定要去坛子里的精华区去取精的~~(sed1line)
|
wingger 回复于:2005-05-30 22:32:36
|
我对sed的label 还不是很清楚,谢了楼主
|
zleil 回复于:2005-05-31 08:35:20
|
[quote:12d31aff9c="wingger"]我对sed的label 还不是很清楚,谢了楼主[/quote:12d31aff9c]
这有几个关于label的例子,
[zleil@ZLEIL shApp]$ echo "aBBbc" | sed -nbp''''p;b label;p;:le;'''';
aBBbc
aBBbc
[zleil@ZLEIL shApp]$ echo "aBBbc" | sed -nbp''''s/B/k/;t label;p;:le;'''';
akBbc
[zleil@ZLEIL shApp]$ echo "aBBbc" | sed -nbp''''s/D/k/;t label;p;:le;'''';
aBBbc
aBBbc
|
yepeng_xj 回复于:2005-06-18 11:23:00
|
[quote:27dd899ec4]$sed --ebp''''2p;3,5p;6~10i [/quote:27dd899ec4]
逗号和分号之间有什么区别么?
|
icesummit 回复于:2005-06-18 12:47:27
|
d>逗号是地址分隔
分号是命令分隔
|
原文转自:http://www.ltesting.net