2013-10|sed命令的用法和一些问题

[size=medium]流编辑器sed的使用

sed [option] command input-file
sed [option] -f script-file input-file


常用选项

n:不输出所有行,默认是输出所有行
e:允许在该选项后面加一条新的编辑指令
f:用于指定装有编辑指令的脚本文件
h:输出sed的帮助信息

常用的定位方式

n:表示行号为n的行
m,n:表示一个行号的范围,从m行到n行
m,n!:排除m行到n行
/pattern/ 表示匹配pattern的所有行
/pattern1 /pattern2/ 表示匹配pattern1和pattern2的所有行,需要使用e将两个模式隔开
/pattern/,+n 从匹配pattern的行开始,向后n行的所有行,这里总共输出n+1行
/pattern/.~n 从匹配pattern的行开始,向后n行的所有行,这里总共输出n行
n,/pattern/ 表示从第n行开始到匹配pattern之内的所有行

例子:
1.使用数字3指定输出的行号,n表示不输出所有行 sed -n '3p' students
加上n参数很重要,否则总是显示所有行,p表示的显示
2.输出第3行到第5行 sed -n '3,5p' students
3.使用模式匹配定位 sed -n '/[tT]angwei/p' students
4.同时使用行号和模式匹配 sed -n '2,/hetao/p' students
此处如果不加n的话,2到hetao匹配的行会打印两遍。因为不加n就会所有行输出一遍,然后这个命令会再输一遍。
5.使用编辑指令=输出行号 sed -n '/xizang/=' students
6.删除行的指令 d 删除第1到第3行 sed '1,3d' students
7.使用编辑指令a在第一行后插入 sed '1a \This is a new line.' students
值得注意的是:sed不会去修改文件的内容,只是对你的操作显示,比如源文件内容是aaaaaa,执行上述操作以后屏幕打印
aaaaaa
This is a new line.
但是文件的内容是不会发生变化的。除非你从定向写入。
例如执行一下命令将结果保存到另一个文件aa1 sed '1a \This is a new line.' students>aa1
8.使用编辑指令a在最后一行后插入 sed '$a \This is a new line.' students
9.如果要插入的数据很长,可以用r先读取再插入 sed '3r ex' students 把ex文件插入3行以后
10.使用~时有这样一个问题:如果你的文本文件aa执行下面的操作
有趣的现象是:如果是使用sed '1,~1p' aa,总是会输出两行,sed '2,~2p' aa,总是会输出3行。与+n的作用一样。
11.用-f参数直接执行脚本文件 sed -f insert.sed aa
insert.sed文件如下:
/a/ i\
The first line.\
The second line.\
the last line.
此时是在匹配a的行前面加上以上3行数据。其中1,2行的反斜杠不能丢。没有反斜杠,linux会去解析2,3两行的数据,认为它是什么命令。[/size]

    推荐阅读