Chinaunix首页 | 论坛 | 博客
  • 博客访问: 927834
  • 博文数量: 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:55:28

6)r读文件。sed使用该命令将一个文本文件中的内容加到当前文件的特定位置。
比如:
along@along-laptop:~/code/shell/sed$ cat file
---------Read File------------
along@along-laptop:~/code/shell/sed$ sed '/along/r file' datafile
along 04075021 1 90
---------Read File------------
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37

7)w 写文件命令。
   sed使用该命令将当前文件中的匹配行写入另外一个文件中。
sed -n ‘/along/w newfile’ datafile
将datafile中包含along的行全部写如newfile文件中。

8)a 追加命令。在当前行之后添加新文本。
比如:
along@along-laptop:~/code/shell/sed$ sed '/along/a\----student----' datafile
along 04075021 1 90
----student----
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37

9)i 插入命令。在当前行之前插入新文本。
比如:
along@along-laptop:~/code/shell/sed$ sed '/along/i\----student----' datafile
----student----
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

10)c 修改命令。sed使用该命令将当前行修改成新文本。
比如:
along@along-laptop:~/code/shell/sed$ sed '/ming/c\----student----' datafile
along 04075021 1 90
----student----
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
----student----

11)n 命令。sed使用该命令获取输入文件的下一行进行处理。
比如:
along@along-laptop:~/code/shell/sed$ cat datafile
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 '/along/{n;s/ming/long/;}' datafile
along 04075021 1 90
xiaolong 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37
将包含along的文本的下一行中的ming改为long。
 
12)y 命令。转换。字符按照一对一的方式从左到有进行转换。
sed '1,3y/abc/ABC/' datafile

13)q 命令。退出。
sed ‘5q’ datafile
显示完第5行时退出。

14)暂存和取用:h和g命令。
  h:将模式空间的内容复制到暂存缓冲区,即一个特殊的临时缓冲区。暂存缓冲区的当前内容被清除。
  H: 将换行符和模式空间的内容追加到暂存缓冲区中,即使暂存缓冲区为空,这个命令也追加换行符。当暂存缓冲区为空时拷贝到暂存缓冲区的内容前边要加上空行,
          当暂存缓冲区不为空时,H这个命令就又不再加空行了。  
  g:将暂存缓冲区中的内容复制到模式空间中,并将当前的内容清除。
  G:将暂存缓冲区内容追加到模式空间。如果暂存缓冲区为空,则将换行符添加到模式空间。

along@along-laptop:~/code/shell/sed$ cat datafile
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

1》along@along-laptop:~/code/shell/sed$ sed -e '/xiao/{h;d;} ' -e '$g' datafile
along 04075021 1 90
chang 04075036 2 79
hang 04075098 3 70
xiaoguang 04075032 2 89
首先找到包含xiao的行,以覆盖的方式将其复制到暂存缓冲区,然后删除当前行,最后以覆盖的方式取出。

2》along@along-laptop:~/code/shell/sed$ sed -e '/xiao/{H;d;} ' -e '$g' datafile
along 04075021 1 90
chang 04075036 2 79
hang 04075098 3 70

xiaoming 04075022 1 92
xiaoguang 04075032 2 89
找到包含xiao的行,以追加的方式将其复制到暂存缓冲区,然后删除当前行,最后以覆盖的方式取出加在文件末尾。

3》along@along-laptop:~/code/shell/sed$ sed -e '/xiao/{H;d;}' -e '${g;s/.//;}' datafile
along 04075021 1 90
chang 04075036 2 79
hang 04075098 3 70
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
比较3和2的不同。

4》along@along-laptop:~/code/shell/sed$ sed -e '/xiao/{h;d;}' -e '$G' datafile
along 04075021 1 90
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37
xiaoguang 04075032 2 89
找到包含xiao的行,以覆盖的方式将其复制到暂存缓冲区,然后删除当前行,最后以追加的方式取出。

5》along@along-laptop:~/code/shell/sed$ sed -e '/xiao/{H;d;}' -e '$G' datafile
along 04075021 1 90
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37

xiaoming 04075022 1 92
xiaoguang 04075032 2 89
找到包含xiao的行,以追加的方式将其复制到暂存缓冲区,然后删除当前行,最后以追加的方式取出。

6》along@along-laptop:~/code/shell/sed$ sed -e '/xiao/{H;d}' -e '$G' datafile|sed -e '/^$/d'
along 04075021 1 90
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
比较5和6的区别。6是清除了空行。

7》现在有文件file:
first line
second line
third line

sed -e '/third/{h;d;}' -e '/first/{G;}'
第1行,第一条命令不匹配,输出第一行;接下来执行第二条命令匹配,所以从暂存空间中取出内容,此时为空所以输出空行。
第二行,第一条不匹配,输出第二行,接下来第二条不匹配
第3行,第一条匹配所以直接执行第一条命令,不输出。接下来执行第二条命令。
故结果:
along@along-laptop:~/code/shell/sed$ sed -e '/third/{h;d;}' -e '/first/{G;}' file
first line

second line


sed -e '/third/{h;d;}' -e '/second/{G;}' file
第一行:第一条命令不匹配,输出第一行;接下来执行第二条命令,不匹配。
第二行:第一条命令不匹配,输出第二行;接下来执行第二条命令,匹配所以从暂存空间中取出内容,此时为空,所以输出空行。
第三行:第一条匹配,不输出,直接删除,并存入暂存空间;第二条不匹配。
故结果:(此时second下面有一个空行)
along@along-laptop:~/code/shell/sed$ sed -e '/third/{h;d;}' -e '/second/{G;}' file
first line
second line

sed -e '/third/{h;d;}' -e '/third/{G;}' file
第一行:第一条命令不匹配,输出第一行;接下来执行第二条命令,不匹配。
第二行:第一条命令不匹配,输出第二行;接下来执行第二条命令,不匹配。
第三行:第一条匹配,不输出,存入暂存空间,并直接从模式空间删除;第二条此时模式空间没有了内容所以也就无法匹配了。
故结果:
along@along-laptop:~/code/shell/sed$ sed -e '/third/{h;d;}' -e '/third/{G;}' file
first line
second line

15)删除空行
现在有文件datafile
along@along-laptop:~/code/shell/sed$ cat datafile
     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
现在想要删除中间的两个空行和每行前边的空格。其中第一个空行是用回车符造成的。第二个使用空格造成的。
如果使用sed '/^$/d' datafile 那么只能删除第一个空行。要想删除两个空行同时删除空格就要这样写:
sed -e '/^[ ]*$/d' -e 's/^[ ]*//' datafile


16)我有文件gr:
90
ad
a9
#8

执行下面这个sed语句:
along@along-laptop:~/code/shell/sed$ sed -n '/^[^0-9a-z]*[0-9]\{1,\}/p' gr
90
#8
这里说明 90 和我的正则表达式   ^[^0-9a-z]*[0-9]\{1,\} 是匹配的。

^[^0-9a-z]*[0-9]\{1,\}  匹配的是:非数字和小写字母出现0次或多次,中间是任意字符,然后再加上1-n个数字组成的字符串。
而 90这个字符串行首是9  符合行首为 0个非数字和小写字母开头,因此就匹配了。

注意:*是匹配前面的0次或多次。
*是匹配前面的0次或多次。所以要匹配不以数字和小写字母开头,中间任意个字符再加一个或多个数字结尾用正则表达式/^[^0-9a-z].*[0-9]\{1,\}/就可以了。

17.sed直接将修改结果保存到源文件中,需要使用-i参数。
也就是:sed -i 's/along/good/' sedx
将修改结果保存到另外的文件中要用到重定向或者是w。
也就是:sed 's/good/along/ w newfile' oldfile  (会在终端上打印修改后的内容)
或者:sed 's/good/along/' oldfile > newfile    (不在终端上打印)
比如下面的例子:
1)直接修改原文件
along@along-laptop:~/code/shell$ cat sedx
good name is along~
along@along-laptop:~/code/shell$ sed -i 's/good/along/' sedx
along@along-laptop:~/code/shell$ cat sedx
along name is along~
2)将结果打印到另外一个文件中。
也就是:sed -i 's/along/good/' sedx
将修改结果保存到另外的文件中要用到重定向或者是w。
along@along-laptop:~/code/shell$ cat sedx
along name is along~
along@along-laptop:~/code/shell$ sed 's/along/good/ w out' sedx
good name is along~
along@along-laptop:~/code/shell$ cat out
good name is along~
along@along-laptop:~/code/shell$ sed 's/good/along/' sedx > out
along@along-laptop:~/code/shell$ cat out
along name is along~

总结:
  h:将模式空间的内容复制到暂存缓冲区,
     即一个特殊的临时缓冲区。暂存缓冲区的当前内容被清除。
  H: 将换行符和模式空间的内容追加到暂存缓冲区中,
即使暂存缓冲区为空,这个命令也追加换行符。
      暂  存缓冲区为空时拷到暂存缓冲区的内容前边要加上空行,当暂存缓冲区不为空时,
H这个命令就
      又不再加空行了。 
  g:将暂存缓冲区中的内容复制到模式空间中,
并将当前的内容清除。
  G:将暂存缓冲区内容追加到模式空间。如果暂存缓冲区为空,
则将换行符添加到模式空间。

along@along-laptop:~/code/
shell/sed$ echo "123" | sed 'h;G'
123
123       ;因为h清空了暂存缓冲区,
而且h拷贝时不会加上回车所以这里没有空格。
along@along-laptop:~/code/
shell/sed$ echo "123" | sed 'H;G'
123

123       ;
H拷贝时暂存缓冲区为空时拷贝到暂存缓冲区的内容前边要加上空行,所以这里会出现一个空行。
along@along-laptop:~/code/
shell/sed$ echo "123" | sed 'H;g'

123        ;这和上边的一样,H会加上一个回车,
同时g会清空模式空间当前的内容
along@along-laptop:~/code/
shell/sed$ echo "123" | sed 'h;g'
123        ;h清空了暂存缓冲区,且拷贝时不加回车,g清空了模式空间,
所以这里只有一行。
along@along-laptop:~/code/
shell/sed$ echo "123" | sed 'H;H;g'

123
123         ;当暂存缓冲区不为空时H就不再加回车了。
所以这里只有一个空行。

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