Chinaunix首页 | 论坛 | 博客
  • 博客访问: 184630
  • 博文数量: 40
  • 博客积分: 2576
  • 博客等级: 少校
  • 技术积分: 494
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-14 17:19
文章分类

全部博文(40)

文章存档

2011年(21)

2010年(19)

我的朋友

分类: LINUX

2010-11-21 22:51:50

Sed的基本用法

Sed的三种命令格式:

   sed [options] 'command' file(s)
  sed [options] -f scriptfile file(s)

  Sed [options] 'command' [address] {

             Command

 Command

.......

} file

Sed的基本选项--options

  要是man的话可以看到有很多选项,这里仅列举下常用到的:

  -e command, --expression=command
    允许多台编辑,可以看后面的例子

   -i [SUFFIX], --in-place[=SUFFIX]

在文件中直接修改,这个很实用。
   -h, --help
   打印帮助,并显示bug列表的地址。
   -n, --quiet, --silent
   取消默认输出。
   -f, --filer=script-file
   引导sed脚本文件名。
   -V, --version
   打印版本和版权信息。

Sed的命令 --command

   Sed的命令有25个,统计如下:

a\
在当前行后面加入一行文本。其实这个\可以没有,只不多有的时候结构更明确,易读。
b lable
分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾,这个主要在sed脚本中实用,在sed的高级用法当中会有介绍。
c\
用新的文本改变本行的文本。
d
从模板块(Pattern space)位置删除行。
D
删除模板块的第一行。
i\
在当前行上面插入文本。
h
拷贝模板块的内容到内存中的缓冲区。
H
追加模板块的内容到内存中的缓冲区
g
获得内存缓冲区的内容,并替代当前模板块中的文本。
G
获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l
列表不能打印字符的清单。
n
读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N
追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p
打印模板块的行。
P(大写)
打印模板块的第一行。
q
退出Sed
r file
file中读行。
t label
if分支,从最后一行开始,条件一旦满足或者Tt命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label
错误分支,从最后一行开始,一旦发生错误或者Tt命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w file
写并追加模板块到file末尾。
W file
写并追加模板块的第一行到file末尾。
!
表示后面的命令对所有没有被选定的行发生作用。
s/re/string
string替换正则表达式re
=
打印当前行号码。
#
把注释扩展到下一个换行符以前。
以下的是替换标记
g表示行内全面替换。
p表示打印行。
w表示把行写入一个文件。
x表示互换模板块中的文本和缓冲区中的文本。
y表示把一个字符翻译为另外的字符(但是不用于正则表达式)

Sed中支持的正则表达式元字符:

 锚定行的开始 如:/^sed/匹配所有以sed开头的行。 
$
锚定行的结束 如:/sed$/匹配所有以sed结尾的行。 
.
匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d。 
*
匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。 
[]
匹配一个指定范围内的字符,如/[Ss]ed/匹配sedSed。 
[^]
匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-RT-Z的一个字母开头,紧跟ed的行。 
\(..\)
保存匹配的字符,如s/\(love\)able/\1rsloveable被替换成lovers。 
&
保存搜索字符用来替换其他字符,如s/love/**&**/love这成**love**。 

\<铆钉单词的结尾

>定单词的结束,如/love\>/匹配包含以love结尾的单词的行。

\b 单词分界线,和上面的两个有基本相同的效果。

x\{m\}
重复字符xm次,如:/0\{5\}/匹配包含5o的行。 
x\{m,\}
重复字符x,至少m次,如:/o\{5,\}/匹配至少有5o的行。 
x\{m,n\}
重复字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10o的行。

Sed中的常用命令举例说明:

打印p命令和-quiet命令:

Sed '/alibaba/p' file

   这时候会打印整篇file,并在匹配alibaba的行下面打印一个相同的行;

Sed -n '/alibaba/p' file

=sed -quiet '/alibaba/p' file

   这时候加上-n命令的话就只打印匹配的行了,所以p命令一般会加上-n选项;

删除d命令:

   sed '/alibaba/d'  file

-----删除file文件中含有alibaba的行
   sed '2,$d' file

  -----删除file文件的第二行到末尾所有行。

替换s命令

sed 's/test/mytest/g' example

   -----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest
sed -n 's/^test/mytest/p' example

   -----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
sed 's/^192.168.0.1/&localhost/'  example

  -----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加localhost,变成192.168.0.1localhost
sed -n 's/\(love\)able/\1rs/p' example

   -----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。

 sed 's#10#100#g' example

   -----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100
选定行的范围:逗号
sed -n '/test/,/check/p' example

   -----所有在模板testcheck所确定的范围内的行都被打印。
sed -n '5,/^test/p' example

   -----打印从第五行开始到第一个包含以test开始的行之间的所有行。

sed '/test/,/check/s/$/sed test/' example

   -----对于模板testwest之间的行,每行的末尾用字符串sed test替换。

追加a命令:

Sed '/^alibaba/a\\

---->the alibaba is a good company!!!<-------'file

  -------在匹配的后面追加一行

替换c命令:

--------主要是替换匹配的整行,用法和a命令相同。

在当前行上面插入i命令

    ------这个也和a命令类似,只不过其添加的内容在匹配行的上面而已!!

从文件读入r命令
    sed '/test/r file' example

   -----file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。

写入文件:w命令
sed -n '/test/w file' example

   -----example中所有包含test的行都被写入file

下一行命令n

   Sed '/alibaba/{n;s/taoshoukun/good boy/;}'  file

-----如果匹配到aibaba,那么就移动到该行的下一行,在找出这行的taoshoukun进行操作。

变形y命令:

     这个命令也很重要,相当于shelltr那个命令办到的事:

   Sed'1,3/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'  file

      ----13行中所有的小写字母变成大写字母,在这里注意不能使用元字符。

退出q命令:

     这个命令一般用到的很少了。

     Sed '2q' file 

      打印完第二行以后就退出sed

     Sed '/alibaba/{s/tao/MM/;q;}'  file

保持h命令:

     Sed -e '/alibaba/{h}' -e '$g' file

      将最后一行替换成alibaba匹配的那行

     Sed -e '/alibaba/{h}' -e '$G' file

      在最后一行追加

注意:在当有多个匹配行的时候会一次的覆盖,取最新匹配的,还有点就是,其后面调用的地址不能比匹配的那行靠前,要不然会是空。

互换x命令:

   Sed -e '/alibaba/h' -e '/tao/x' file

Tao这个匹配行用alibaba那行替换,然后将tao匹配的这行放到缓存中,留以后g调用。

Sed 对列进行处理:

  大家都知道sed对行处理的功能强大,但对列处理的能力就一般了,但不是绝对不能,下面举一个例子说明:

   原文:Alibaba is a good company

   要求将第一列和第二列调换一下:

   Sed 's/^\(\w*\) \(\w*\) /\2 \1/g' file 

   这个是我 自己想到的,不知道是否有更好的方法,就抛砖引玉吧!!!

补充:

   1。 在sed中用/alibaba/,/tao/来匹配地址的时候,是从出现第一个alibaba开始记,然后到出现第一个tao的时候结束。而且有多少个这样的区间就匹配多少次。

问题:

  

阅读(1760) | 评论(2) | 转发(0) |
0

上一篇:grep的用法大全

下一篇:Sed高级用法

给主人留下些什么吧!~~

chinaunix网友2010-11-25 00:22:05

good

chinaunix网友2010-11-22 17:51:39

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com