grep、sed和awk在Linux/Unix系统中并称为文本处理三剑客(结合正则表达式使用);正则表达式
1、什么是sed? shell
sed是非交互式文本编辑器,它能够对文本文件和标准输入进行编辑,标准输入能够是来自键盘输入、文件重定向、字符串、变量,甚至来自管道的文本。它是流式编辑器。vim
2、sed的工做过程:app
sed从文本的一个文本行或标准输入中读取数据,将其复制到缓冲区,而后读取命令行或脚本的第一个命令,对此命令要求的行号进行编辑,重复此过程,直到命令行或脚本中的全部命令执行完毕。
编辑器
3、特色:ide
相对于其余的文本编辑sed具有如下让人难以拒绝的特色;函数
一、 非交互式,基于模式匹配的过滤及修改文本。spa
二、逐行处理,因此对温馨的交互式编辑而言太大的文件使用sed会显得 十分高效
命令行
,为用户节省了大量的时间。orm
三、可实现对文本的输出、删除、替换、复制、剪切、导入、导出等各类编辑操做。
四、脚本化,在shell脚本编辑中vim须要通知处理文件的哪几行才会去处理,而sed默认会处理文件的全部行。
五、sed只对缓冲区(模式空间)中原始文件的副本进行编辑,不编辑原文件。若是要把编辑后的内容保存,能够将输出重定向输出到另外一个文件。
4、sed适用于如下三种场合
一、编辑相对交互式文件编辑器而言太大的文件
二、编辑命令太复杂,在交互式文本编辑器中难以输入的状况
三、对文件扫描一遍,可是须要执行多个编辑函数的状况
5、sed 相关使用详解:
一、语法格式:sed [OPTION]... {script-only-if-no-other-script} [input-file]...
OPTION----选项
script-----地址定界编辑命令
input-file----输入文件
二、选项[OPTION]:
(1)、经常使用选项:
-n:不输出(模式空间)中的内容到标准输出(显示屏);
sed -n '1p' input
-e:多点编辑(-e script),表示将下一个字符串解析为sed编辑命令。若是只传送一个命令给sed时,-e 能够省略;
sed -e '1p/p' -e '1p/=’input
-f:表示正在调用sed脚本文件(-f /PATH/TO/SED_SCRIPT_FILE),每行一个编辑命令。
例如:脚本append.sed脚本演示sed追加文本方法
#!/bin/sed -f
/file:/a\ a\表示此处换行添加文本
-r:从文本中读取文本,支持扩展正则表达式;
echo “aa bb” | sed -r 's/(.)/a/' 若是不加-r时,后面的()符号要转义
-i:在定位行号以前直接编辑原文件。
sed -i 's/inn/out/g' test.txt
(2)、地址定界:
sed命令一般由定位文本行和sed编辑命令两部分组成;
使用行号,指定一行,或指定行号范围
使用正则表达式
1)、空地址:对全文进行处理
2)、单地址:
x:表明指定行号;
/pattern/:查看包含模式的行,或此模式匹配到的行
3)、地址范围:
x,y:指定x到y的行号范围内
x,+y:指定x,到后面y行范围
x,/pattern/:从x号行到与/pattern/的匹配行之间的行
/patter/pattern/:查询包含两个模式的行
$:最后一行
4)、步进:~
1~2:匹配全部奇数行
2~2:匹配全部的偶数行
(3)、地址定界:
d:删除,删除所匹配到的行(后面通常不接什么)
p:列印,显示模式空间中的内容(一般与sed -n 一块儿出现)
a\text:新增,text为字串,这些字串会在新增到下一行出现
i\text :插入,text为字串,这些字串会在新增到上一行出现
c\text:替换 ,text为字串 ,这些字串能够取代n1,n2之间的行
s///:查找替换,能够直接进行替换,一般结合正则表达式 法,
其分隔符可自行指定,经常使用的有s@@@, s###等
g:全局替换;
w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
p:显示替换成功的行;
6、sed 实例:
举例:(假设咱们有一文件名为ab)
删除某行
[root@localhost gayj] # sed '1d' ab #删除第一行
[root@localhost gayj] # sed '$d' ab #删除最后一行
[root@localhost gayj] # sed '1,2d' ab #删除第一行到第二行
[root@localhost gayj] # sed '2,$d' ab #删除第二行到最后一行
显示某行
[root@localhost gayj] # sed -n '1p' ab #显示第一行
[root@localhost gayj] # sed -n '$p' ab #显示最后一行
[root@localhost gayj] # sed -n '1,2p' ab #显示第一行到第二行
[root@localhost gayj] # sed -n '2,$p' ab #显示第二行到最后一行
使用模式进行查询
[root@localhost gayj] # sed -n '/gayj/p' ab #查询包括关键字gayj所在全部行
[root@localhost gayj] # sed -n '/\$/p' ab #查询包括关键字$所在全部行,使用反斜线\屏蔽特殊含义
增长一行或多行字符串
[root@localhost gayj]# cat ab
Hello!
gayj is me,welcome to my blog.
end
[root@localhost gayj] # sed '1a drink tea' ab #第一行后增长字符串"drink tea"
Hello!
drink tea
gayj is me,welcome to my blog.
end
[root@localhost gayj] # sed '1,3a drink tea' ab #第一行到第三行后增长字符串"drink tea"
Hello!
drink tea
gayj is me,welcome to my blog.
drink tea
end
drink tea
[root@localhost gayj] # sed '1a drink tea\nor coffee' ab #第一行后增长多行,使用换行符\n
Hello!
drink tea
or coffee
gayj is me,welcome to my blog.
end
代替一行或多行
[root@localhost gayj] # sed '1c Hi' ab #第一行代替为Hi
Hi
gayj is me,welcome to my blog.
end
[root@localhost gayj] # sed '1,2c Hi' ab #第一行到第二行代替为Hi
Hi
end
替换一行中的某部分
格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串能够用正则表达式)
[root@localhost gayj] # sed -n '/gayj/p' ab | sed 's/gayj/bird/g' #替换gayj为bird
[root@localhost gayj] # sed -n '/gayj/p' ab | sed 's/gayj//g' #删除gayj
插入
[root@localhost gayj] # sed -i '$a bye' ab #在文件ab中最后一行直接输入"bye"
[root@localhost gayj]# cat ab
Hello!
gayj is me,welcome to my blog.
end
bye
删除匹配行
sed -i '/匹配字符串/d' filename (注:若匹配字符串是变量,则须要“”,而不是‘’。记得好像是)
替换匹配行中的某个字符串
sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename