接着介绍命令吧。
(7)写文件:w命令
gaolu@gaolu-desktop:~$ sed -n '/100/w newfile1' datafile
-----将包含模式100的行写到文件newfile1内,取消打印。这样执行命令以后通过显示newfile1的内容可以看到存在2行。
gaolu@gaolu-desktop:~$ cat newfile1
William 100
Lucy 100
gaolu@gaolu-desktop:~$
(8)追加:a命令
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ sed '/^Jim /a\
> hello Jim\
> Good boy' datafile
NAME SCORE
William 100
Suan 90
Jim 80
hello Jim
Good boy
Lucy 100
Tom 9
gaolu@gaolu-desktop:~$
如果一行以Jim开头,且后面跟空格,则在这行后面追加内容。sed要求a命令以反斜杠结束,被追加的内容必须在a命令的下一行,如果内容存在多行,则除了最后一行之外每行都需要以反斜杠结束。
(9)插入命令:i
gaolu@gaolu-desktop:~$ sed '/100/i\
> ---------------------------------\
> The next student is very good:\
> ---------------------------------' datafile
NAME SCORE
---------------------------------
The next student is very good:
---------------------------------
William 100
Suan 90
Jim 80
---------------------------------
The next student is very good:
---------------------------------
Lucy 100
Tom 9
gaolu@gaolu-desktop:~$
与追加类似,只不过i命令是在包含模式的所有行之前插入命令所带参数的内容。sed也是要求i命令后面以反斜杠结束,文本若超过一行,除了最后一行以外每行均以反斜杠结尾。
(10)下一行:n命令
gaolu@gaolu-desktop:~$ sed '/100/ {n; s/Suan/Suan Li/;}' datafile
NAME SCORE
William 100
Suan Li 90
Jim 80
Lucy 100
Tom 9
gaolu@gaolu-desktop:~$
n命令指示sed用下一行替换模式空间中的当前行。上面命令的意思则是如果一行包含模式100,则用下一行替换模式空间当前的行,若新替换的行包含模式Suan,再用Suan Li替换Suan。
(11)转换:y命令
gaolu@gaolu-desktop:~$ sed '1,3y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' datafile
NAME SCORE
WILLIAM 100
SUAN 90
Jim 80
Lucy 100
Tom 9
gaolu@gaolu-desktop:~$
将小写字母全部转换为大写字母。
上面命令中的1,3表示地址,即对1~3行执行转换。
(12)退出:q命令
gaolu@gaolu-desktop:~$ sed '5q' datafile
NAME SCORE
William 100
Suan 90
Jim 80
Lucy 100
gaolu@gaolu-desktop:~$
q命令让sed程序退出。
上面命令是在处理到第五行时,打印完当前行以后,退出sed.
(13)保持-替换/追加
gaolu@gaolu-desktop:~$ sed -e '/William/{h;d}' -e '/Lucy/{G;}' datafile
NAME SCORE
Suan 90
Jim 80
Lucy 100
William 100
Tom 9
gaolu@gaolu-desktop:~$ sed -e '/William/{h;d}' -e '/Lucy/{g;}' datafile
NAME SCORE
Suan 90
Jim 80
William 100
Tom 9
gaolu@gaolu-desktop:~$
sed处理文件时,读一行到模式空间进行处理,处理后将结果打印到屏幕,除非前面的处理是d(删除行)或者用选项-n关闭缺省打印。而后清除模式空间的内容,读下一行来处理……
另外,还有一个特殊的缓冲区,成为暂存缓冲区(holding buffer)。h命令就是将当前模式空间的内容拷贝复制到holding buffer。h通常与G和g命令和用,区别如下:
G是从holding buffer取一行,追加到模式空间当前行后面。
g是从holding buffer取一行,替换模式空间当前行。
(14)交换:x命令
gaolu@gaolu-desktop:~$ cat datafile
NAME SCORE
William 100
Suan 90
Jim 80
Lucy 100
Tom 9
Lucy 100
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ sed -e'/William/{h;d}' -e '/Lucy/x' datafile
NAME SCORE
Suan 90
Jim 80
William 100
Tom 9
Lucy 100
gaolu@gaolu-desktop:~$
x命令是将holding buffer的内容与模式空间当前行进行互换。
因此当匹配到模式William时,将其拷贝到holding buffer,并将模式空间删除,于是该行看不到打印。
而后面第一次匹配到Lucy时,用holding buffer中包含William的行与模式空间当前行互换,这样打印的就是包含William的行了。
后面第二次匹配到Lucy时,模式空间当前行内容与holding buffer一致,所以看不到什么差别。