Chinaunix首页 | 论坛 | 博客
  • 博客访问: 927790
  • 博文数量: 146
  • 博客积分: 3321
  • 博客等级: 中校
  • 技术积分: 1523
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-29 10:32
文章分类

全部博文(146)

文章存档

2014年(2)

2013年(5)

2012年(4)

2011年(6)

2010年(30)

2009年(75)

2008年(24)

分类:

2009-07-15 23:49:33

1.Sed是一个非交互性文本流编辑器。sed与awk类似,执行时可以使用命令行;可以将
  sed命令写入一个文件,然后调用sed;也可以将sed命令插入一个脚本文件并使脚本文件可执行。
    一般情况下sed并不与初始化文件打交道,他操作的只是一个拷贝,如果要修改原文件那么就要用-i选项。

2.sed的工作过程:sed逐行处理输入文件,首先从输入文件读入一行到模式空间
    也就是临时缓冲区,在该行上执行所有命令,将结果发送到指定的区域(stdout或指定的文件中)。当我们执行的是
    一个sed脚本文件,那么我们就从输入文件中读入一行数据到模式空间,执行脚本文件中的所有命令,然后在继续读取输入
   文件的下一行,并开始用sed脚本文件中的命令去处理文本。

3.sed定位文本的方法有两种:一种是行号,一种是正则表达式。

4.命令与选项:sed命令告诉sed如何处理由地址指定的各输入行。如果没有指定地址,sed就会处理所有的输入行。
   sed的命令包括:
    a\  :在当前行之后添加。追加。
    c\  :用新文本替换当前行的文本。
    d   :删除当前行
    i\  :在当前行之前插入文本
    p   :打印行
    g   :在行内进行全局替换
    w   :将行写入文件
    s   :用一个字符串替换另一个
   命令还有很多,这里只列出了比较常用的几个。
   sed的选项:
    -e  :允许多项编辑
    -f  :指定sed脚本文件名
    -n  :取消默认的输出

4.当没有出现语法错误时sed返回0。出现语法错误时返回非零。

5.
采用下面这个datafiel文件作为示例
along 04075021 1 90
xiaolong 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinlong 0408098 2 jinming 37


1)p命令
along@along-laptop:~/code/shell/sed$ sed '/along/p' datafile
along 04075021 1 90
along 04075021 1 90
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37

这是将所有找到的匹配行都打印两遍

along@along-laptop:~/code/shell/sed$ sed -n '/xiao/p' datafile
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
当加上了-n选项时,只打印匹配行。
-n要和 p 配合使用

2)d命令(删除)从模式空间中删除并读入下一行

sed ‘3d’ datafile:删除第三行
along@along-laptop:~/code/shell/sed$ sed '3d' datafile
along 04075021 1 90
xiaoming 04075022 1 92
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37


sed ‘3,$d’ datafile(删除第三行到最后一行)
sed '/along/d' datafile(包含模式along的行都被删除,其余行打印)
sed -n '/along/d' datafile(删除包含模式along的行,此时显示内容为空)

3)s命令(替换)
along@along-laptop:~/code/shell/sed$ sed  's/ming/long/g' datafile
along 04075021 1 90
xiaolong 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinlong 0408098 2 jinlong 37
用long替换所有的ming。如果没有g那么将只替换每一行第一个ming。比如(注意观察最后一行):
along@along-laptop:~/code/shell/sed$ sed  's/ming/long/' datafile
along 04075021 1 90
xiaolong 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinlong 0408098 2 jinming 37

sed 's/[9]/&.5/g' datafile (在所有的9后边都加上一个.5)
比如:
along@along-laptop:~/code/shell/sed$ sed 's/9/&.5/g' datafile
along 04075021 1 9.50
xiaoming 04075022 1 9.52
xiaoguang 04075032 2 89.5
chang 04075036 2 79.5
hang 0407509.58 3 70
jinming 040809.58 2 jinming 37
当符号“&”和s一起用的时候,表示在找到的匹配串后边加上相应的串。

紧跟在s命令后边的字符就是查找串和替换串之间的分隔符。分隔符默认是正斜杠,但是可以改变。无论什么字符
只要紧跟这s就成了新的分隔符。
比如:
along@along-laptop:~/code/shell/sed$ sed -n 's#ming#along#gp' datafile
xiaoalong 04075022 1 92
jinalong 0408098 2 jinalong 37

4)定址
along@along-laptop:~/code/shell/sed$ sed -n '1,/ming/p' datafile
along 04075021 1 90
xiaoming 04075022 1 92
从第一行开始打印直到第一次出现ming

along@along-laptop:~/code/shell/sed$ sed -n '2,2p' datafile
xiaoming 04075022 1 92
只打印第二行的内容。

5)-e多重编辑选项。用于sed执行多个编辑命令时将前一个的编辑结果应用到后一个编辑命令上。
along@along-laptop:~/code/shell/sed$ sed -n -e 's/ming/long/' -e 's/long/mn/gp' datafile
amn 04075021 1 90
xiaomn 04075022 1 92
jinmn 0408098 2 jinming 37
这个例子没有任何作用,只是为了说明问题。
首先第一行原来是along,当执行第一条编辑命令时发现无法匹配,于是继续执行第二条编辑命令将long替换为mn。
第二行就不用再说了。
第三行,首先执行第一条编辑命令,发现没有 g 命令,于是就只是将第一个ming替换为long;然后执行第二条编辑命令
      此时虽然有 g 这个命令,但是已经于事无补,因为当前行此时只有一个long。所以结果也就理所当然是这样了jinmn 0408098 2 jinming 37。

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