sed是一个非交互式文本编辑器,他可以对文本文件和标准输入进行编辑,标准输入可以是来自键盘,文件重定向,字符串,变量甚至来自于管道的文本。sed适用于以下三种场合:
- 编辑相对交互式文本编辑器而言太大的文件。
- 编辑命令太复杂,在交互式文本编辑器中难以输入的情况。
- 对文件扫描一遍,但是需要执行多个编辑函数的情况
调用sed有三种方式,一种为she'll命令行方式,另外两种是将sed命令写入脚本,然后执行该脚本文件。三种方式归纳如下:
- shell命令行输入命令调用sed,格式为:
-
sed [选项] 'sed命令' 输入文件
- 将sed命令插入脚本文件后,通过sed命令调用它,格式为:
-
sed [选项] -f sed脚本文件 输入文件
- 将sed命令插入脚本后,最常用的方法是将该脚本设置为可执行文件,然后直接执行该脚本,格式为:
-
./sed脚本文件 输入文件
sed命令选项及意义:
选项 | 意义 |
-n | 不打印所有行到标准输出 |
-e | 表示将下一个字符串解析为sed编辑命令,如果只传递一个编辑命令给sed,-e选项可以省略 |
-f | 表示正在调用sed脚本文件 |
sed通常由定位文本行和sed编辑命令两部分组成,sed提供以下两种方式定位文本:
- 使用行号,指定一行或者行号范围
- 使用正则表达式
下表是sed定位文本的方法
选项 | 意义 |
x | x为指定行号 |
x,y | 指定从x到y的行号范围 |
/patten/ | 查询包含模式的行 |
/pattern/pattern/ | 查询包含两个模式的行 |
/pattern/,x | 从与pattern匹配的行到x行号之间的行 |
x,/pattern/ | 从x号行到与pattern匹配行之间的行 |
x,y! | 查询不包括x,y行号的行 |
下面将在示例中说明sed的命令选项的意义,新建一个名为sedtest的文件,内容如下:(测试过程中可能会有修改)
this is a test file for sed Test is real important
what i want to say is: haha nobody is god except allah.
This is very IMPORTYANT what you want to say is:goodbye! where to go? I don't know! this cool!
- -n选项
#第一条命令,带-n选项,只打印第一行 [root@linuxTest ~]# sed -n '1p' sedtest this is a test file for sed #第二条命令,不带-n,不仅打印第一行,还打印输入文件的全部内容 [root@linuxTest ~]# sed '1p' sedtest this is a test file for sed this is a test file for sed Test is real important what i want to say is: haha nobody is god except allah. This is very IMPORTYANT
#打印行范围
root@linuxTest ~]# sed -n '2,6p' sedtest
Test is real important
what i want to say is: haha
nobody is god except allah.
This is very IMPORTYANT
- -e选项
#sed编辑命令“=”用来匹配is关键字的行号,如果希望行号和行内容都打印出来,则需要传递p和=两个编辑命令 [root@linuxTest ~]# sed -n -e '/is/=' -e '/is/p' sedtest 1 this is a test file for sed 2 Test is real important 3 what i want to say is: haha 5
-s选项
#使用替换模式替换相应模式 #p选项,只替换每行第一个符合条件的文本 [root@linuxTest ~]# sed -n 's/is/IS/p' sedtest thIS is a test file for sed Test IS real important what i want to say IS: haha nobody IS god except allah. ThIS is very IMPORTYANT what you want to say IS:goodbye! thIS cool! #2p,如果每行含有两个及两个以上目标文本,则只替换每行第二个符合条件的文本 [root@linuxTest ~]# sed -n 's/is/IS/2p' sedtest this IS a test file for sed This IS very IMPORTYANT #pg,如果该行中含有目标文本,则不论几个都替换。 [root@linuxTest ~]# sed -n 's/is/IS/pg' sedtest thIS IS a test file for sed Test IS real important what i want to say IS: haha nobody IS god except allah. ThIS IS very IMPORTYANT what you want to say IS:goodbye! thIS cool!
#w,替换后,保存文本到另外一个文件
[root@linuxTest ~]# sed -n 's/is/IS/gw output' sedtest