sed是什么
sed是linux自带的一种流编辑实用工具。但是她是非交互的(必须将要对数据执行的命令插入到命令行或要处理的脚本中)。sed 在一个文件(或文件集)中非交互式、并且不加询问地接收一系列的命令并执行它们。
sed能干什么
举个例子,在你编辑的一篇英文文本中,由于出于某种需要,需要将所有的空格替换成‘:’,你是要手动改吗?当然,手动改可以实现,但是你可以想象这个过程的boring程度(单词之间都要修改)。sed要怎么操作呢?“$sed s/ /:/g filename > newfile修改完的文件就生成了。这只是sed流编辑器的功能之一,想知道sed的其他功能,follow me。
sed功能展示
1. sed语法
sed [options] '{command}' [filename]
2. 替换,s命令
命令形式:'s/{oldstring}/{newstring}/'
语法形式跟vi里的替换命令很相似,不熟悉的可以参看一下我博客里的vi替换命令。
$ echo The tiger cubs will meet on Tuesday after school | sed 's/tiger/wolf/'
The wolf cubs will meet on Tuesday after school
$
3. 多次替换
如果需要多次替换,可以三种命令方式来实现
a. -e选项,该选项通知sed使用了多条编辑命令
$ echo The tiger cubs will meet on Tuesday after school | sed -e 's/tiger/wolf/' -e 's/after/before/'
The wolf cubs will meet on Tuesday before school
$
b. 相对简单的实现使用‘;’
$ echo The tiger cubs will meet on Tuesday after school | sed '
s/tiger/wolf/; s/after/before/'
The wolf cubs will meet on Tuesday before school
$
注:‘;’要紧跟‘/’后,不要出现空格。
应该注意到这里出现了'',''之间的内容被解释为sed的命令,当输入第一'时,shell会期待第二个'的出现,在第二个'后输入回车,才会执行sed命令。由此出现第三种方式。
c.
$ echo The tiger cubs will meet on Tuesday after school | sed '
> s/tiger/wolf/
> s/after/before/'
The wolf cubs will meet on Tuesday before school
$
4. 全局修改,g选项
当你的文本中出现多个{oldstring}的时候,用上面的命令时发现每行中只有第一次出现的地方会被替换,那怎样实现替换所有的呢?选项g来完成。在每条s/{oldstring}/{newstring}/最后加上g,就会将该行中所有的oldstring替换掉。
5. 精确修改,符号/
当你需要修改含有特定内容的行时,在修改命令前加/keyword/ sed command。
$sed /tiger/ s/tiger/wolf/g sample_txt
该命令将修改所有含有tiger的行,并且修改该行中所有tiger
以上讲的都是sed的替换工作,那sed还有其他的功能吗?当然!
6. 打印,p命令
[地址范围]/p:显示地址范围内的所有行。
当然了,这里的地址范围可以是5,10的形式,表示显示从5行到10行的内容;也可是/keyword/匹配关键字的行的内容。
7. 删除,d命令
删除功能当然也是sed必备的了,形式:[地址范围]/d
'10d' |
删除输入的第10行 |
'1,3 d' |
删除1-3行 |
'/^two/ d' |
删除以two开头的行(^表示一行的开始) |
'/two$/ d' |
删除以two结尾的行(^表示一行的结尾或文件的结尾) |
'/^$/ d' |
删除空白行(^和$之间没有任何内容) |
'1,/^$/ d' |
删除从第一行开始到第一个空白行的内容 |
'/two/ d' |
删除包含two的所有行 |
'/two/ !d' |
删除不包含two的所有行 |
8. 对文件的操作
a. 向文本里添加你的内容,a命令
'3a\ context' filename:在第三行后加入一行。(\表示换行)
'$a\ context' filename:在文件结束的地方加入一行
'/keyword/ a\ context' filename:在含有关键字的行的后面添加一行
b. 向文本里插入你的内容,i选项
用法跟上面一样,只是这里会在你感兴趣的行的地方插入你的内容,而不是行的后面。
c. 写文件(非重定向),w命令
'1,3 w newfile' oldfile:将oldfile中的1-3行的内容写入newfile,如果newfile不存在会自动创建之,如果newfile已经存在则会重写newfile里的内容。
'/keyword/ w newfile' oldfile:理解这条语句应该没问题了吧!
不觉得用这个命令来提取自己感兴趣的信息很好用吗?
d. 修改,c命令
这里的修改不是s的效果。s只是替换相应的字符串,c则替换这个行
'1,3 c\ context' filename:将1-3行的所有的内容替换成一行的context,而不是3行
'/keyword/ c\ context' filename:将匹配关键字的行替换成context
e. 提前退出,q命令
'sedcommand 8q' filename:sed操作执行到第八行的时候停止退出
'sedcommand /keyword/ q' filename:sed操作执行完第一次含有keyword的行后,停止退出
9. sed脚本,-f选项
如果你觉得每次在shell中输入命令很不方便,而且这个命令要重复执行很多次,那么,就应该先编写一个sed脚本,每次执行脚本就好了。
$ cat sedlist
/two/ s/1/2/
/three/ s/1/3/
$
怎么执行这个脚本呢? sed -f sedlist filename就可以了。你可以在脚本里写下你的密令尽情的折腾文件了,呵呵。
注:sedlist内的命令不需要用'号。
今天就先到这里吧,像标签申明(:标签名)、标签操作(b {label}:处理跳转至label处或文件尾;t {label}:只要自上次输入行或执行一次 "t" 命令以来进行了替换操作,就转至该标签或文件尾)都没有用到呢,等以后继续发掘sed的奥秘吧!
阅读(1017) | 评论(0) | 转发(0) |