Chinaunix首页 | 论坛 | 博客
  • 博客访问: 863135
  • 博文数量: 102
  • 博客积分: 7086
  • 博客等级: 少将
  • 技术积分: 2245
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-18 11:01
文章分类

全部博文(102)

文章存档

2012年(2)

2011年(1)

2010年(21)

2009年(31)

2008年(47)

我的朋友

分类: LINUX

2010-03-27 12:02:43

很强大又很难,其中还有很多没懂,先都总结下来再慢慢学习。

sed   sed命令是隐性的全局命令

参数s:替换文字内字符串。最多与两个地址参数配合。

1.在包含字符串test的任意行上,将111替换成222
#sed '/test/s/111/222/g'  sample.txt  

2.以下三个命令相等,先在包含字符串test的任意行上,将111替换成222,再将字符f替换成hello
#sed '/test/s/111/222/g ; s/f/hello/g' sample.txt
#sed -e '/test/s/111/222/g' -e 's/f/hello/g' sample.txt
将要执行的所以编译命令放入在文件中
#more scher
/test/s/111/222/g
s/f/hello/g' sample.txt
#sed -f scher sample.txt

3.替换每行的第N个匹配(示例为替换第八个字符)
#sed ‘s/test/TEST/8' sample.txt

4在第三到第五行前加入hello
#sed '3,5 s/^/hello/' sample.txt

参数d: 删除数据行。最多与两个地址参数配合。
1.删除第一到三行
#sed ‘1,3d’sample.txt

2.删除带user的行
#sed ‘/user/d’sample.txt

3.删除带有a或b字符的行
#sed '/[ab]/d' sample.txt

参数a:将资料添加到指定文件后。最多与一个地址参数配合。
1.在含有FTP的行后面插入一行123
#sed -e '/FTP/a\123' sample.txt

2.在第五行后插入123
#sed -e '5 a\123' sample.txt

参数i将资料插入到指定文件前。最多与一个地址参数配合。
1.在含有FTP的行前面插入一行123
#sed -e '/FTP/i\123' sample.txt

2.在第五前后插入123
#sed -e '5 i\123' sample.txt


参数c:改变文件中的数据。最多与两个地址参数配合。
1.以使用者输入的数据取代数据
eg:将文件1到100行的数据替换成test
#sed -e '1.100c test' sample.txt

2.把a和b替换成hello
#sed '/[a b]/c\hello' sample.txt   

参数p:打印出资料。最多与两个地址参数配合。
1.打印出含有a或b的行
#sed -n -e '/[ab]/p' sample.txt

参数r:读入他的档案内容到文件中。最多与一个地址参数配合。
1.将temp.txt中的内容,搬至文件中含有AA字符串的数据行后(temp.txt中有内容)
#sed -e '/AA/r temp.txt' sample.txt

参数w:读入文件中的内容存入到另一文件中(temp.txt)。最多与一个地址参数配合。
1.将文件中含test字符串的数据行,copy至temp.txt档中储存(原temp.txt中无内容)
#sed -e '/test/w temp.txt' sample.txt

参数y:转换数据中的字符。最多与两个地址参数配合。
1.将文件中的小写字母替换成大写字母。
#sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' sample.txt
其中前后字符个数必须相同.

参数!:表示不执行函数参数。
1.将文件中除了important字符串,其余全删除。
#sed -e '/important/!d' sample.txt

参数n:表示读入下一行数据。最多与两个地址参数配合。
解释:例如源文件为:
A
B
C
D
那么实际读入到pattern space的数据就为B D,因为他们分别为第一行A和第三行C的下一行.
1.输出源文件的偶数行数据。
#sed -n -e 'n' -e 'p' sample.txt
或#sed -n 'n;p' sample.txt
这里-n是选项。‘’中的n才是参数。-n的意思是将数据输出的控制权转给指令,即只显示处理后的结果。
利用n将下一行资料(即:偶数行)取代pattern space的资料行(奇数行)
2.输出源文件的奇数行数据。
#sed -n -e 'p' -e 'n' sample.txt
#sed -n 'p;n' sample.txt

参数q:表示跳离sed。最多与一个地址参数配合。
1.打印出含有a或b字符的行,一旦遇到数字,即刻停止打印。
#sed -n -e '/[0-9]/q' -e '/[a b]/p' sample.txt

参数=:表示印出资料的行数。最多与两个地址参数配合。
1.印出文件资料中的行数。
#sed -e ‘=’ sample.txt

参数#:表示对文字的注释。

参数N:表示添加下一笔资料到pattern space内。最多与两个地址参数配合。添加下一笔:添加一笔资料后,继续添加这个资料的下一行数据到pattern space内)
1,将文件中的数据合并。文件内容如下:
UNIX
LINUX
#sed -e 'N' -e's/\n/\,/g' sample.txt
结果如下:
UNIX,LINUX

参数D:表示删除pattern space内的第一行资料。最多与两个地址参数配合。

参数P:打印出pattern space内的第一行资料。
#sed -n -e 'N' -e 'P' sample.txt
利用N将下一行资料(即:偶数行)添加到pattern space内,在利用P打印出奇数行。
解释过程:由于N的作用,使得每次添加一条资料到pattern space后,先不执行操作,而是继续添加这个资料的下一行到pattern space内,
然后P参数打印出第一行资料。


参数h:表示暂存pattern space的内容至hold space(覆盖)。最多与两个地址参数配合。

参数H:表示暂存pattern space的内容至hold space(添加)。最多与两个地址参数配合。

参数g:表示将hold space的内容放回至pattern space内。(覆盖掉原pattern space内的数据)

参数G:表示将hold space的内容放回至pattern space内。(添加大到原pattern space数据之后)
1.将文件中所有空行删除,并在每一行后面增加一个空行。
sed '/^$/d;G' sample.txt
2.将文件中所有空行删除,并在每一行后面增加两个空行。
sed '/^$/d;G;G' sample.txt

参数x:表示交换hold space与pattern space内的数据。
1.将文件第三行的数据替换成第一行的数据。
#sed -e '1h' -e '3x' sample.txt

参数b:

参数t:


一些示例:
1.在匹配式样test的行之前插入一空行。
#sed '/test/i\ ' sample.txt
#sed '/test/{x;p;x}' sample.txt

2.在匹配式样test的行之后插入一空行。
#sed '/test/a\ ' sample.txt
#sed '/test/G' sample.txt

3.为文中每一行进行编号。
#sed = sample.txt | sed 'N;s/\n/:/'
#sed = sample.txt | sed 'N;s/\n/\t/'

4.为文中每一行进行编号,但只显示非空行的编号。
#sed /./= sample.txt | sed '/./N;s/\n/:/'
.不匹配空。将sample.txt中所有非空行编号,然后取出不包含非空行的行及其下一行数据放入pattern space内,再将空格替换成:)

5.计算文件行数。
#sed -n '$=' sample.txt

6.字串翻转。
#sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'

7,打印文档奇数行。
#sed 'n;d'
#sed 'x;$!N;x'
#sed -n 'p;n'    (sed  -n -e 'p' -e 'n' )
#sed -e  'n' -e 'd' 将文件下一行(偶数行),放进pattern space中并删除。

8.打印文档偶数行。
#sed '1d;n;d;'  (先删掉第一行,再像奇数行类似处理)
#sed -n 'n;p'    (sed -n -e 'n' -e 'p')

9.删除连续重复行。(可以用sort加uniq取代)
#sed '$!N; /^\(.*\)\n\1$/!P; D'

10.合并上下两行并用空格分割
#sed '$!N;s/\n/ /'
#sed -e 'N' -e 's/\n/ /g'

11.将以\符号结尾的行与下行合并并以空格分隔(拼接断行)
#sed -e :a -e '/\\$/N; s/\\\n/ /; ta'

12.按关键字拼接行。
如果某行以=开始,则合并到上一行并替代=为空格
#sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'

13.输出匹配行的下一行 (grep -A)
#sed -n '/regexpr/{n;p;}' filename

14.显示匹配行的行号并输出匹配行的上行、匹配行、下行 (grep -N N为想显示的行数)
#sed -n -e '/regexpr/{=;x;1!p;g;$!N;p;D;}' -e h

15.删除文档中某标志区域内的关键字匹配行
 删除文档中从being开到end结束的块中包含myword的行
#sed '/^begin/,/^end/{/myword/d;}' filename

16.字串解析。
1.从字串中解析出两个子串(前2各字符和后9个字符)
#echo "WeLoveChinaUnix"|sed -e 'H;s/\(..\).*/\1/;x;s/.*\(.\{9\}\)$/\1/;x;G;s/\n/ /'
We ChinaUnix
2.分解日期串
echo 20030922|sed 's/\(....\)\(..\)\(..\)/\1 \2 \3/'|read year month day
echo $year $month $day
2003 09 22
例如想把aaaa1111bbbb分成 aaaa 1111 bbbb
sed 's/\(....\)\(....\)\(....\)/\1 \2 \3/' sample.txt
\1 \2中间的部分就是想空出来的部分。

示例部分参考
作者:

补:
sed '/aaa/,/bbb/s/yes/no/' sample.txt
将文件sample.txt中,一行中的aaa到bbb中间的yes替换成no
阅读(5777) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~