sed简介
sed是一个非交互式文本编辑器,它可以对文本文件和标准输入进行编辑,标志输入可以来自键盘输入、文本重定向、字符串、变量、甚至来自于管道符。逐行处理内容,一次只处理一行内容。
sed工作流程
1、读新的一行到缓存空间(pattern space)
2、从指定的操作指令中依次取出指令执行,判断是否匹配缓存空间内容
3、如果不匹配则忽略后续的编辑命令,回到第2步继续取出下一条指令
4、如果匹配,则针对缓存的行执行后续的编辑命令;完成后,回到第2步继续取出下一条指令
5、当所有指令都应用之后,输出缓存行的内容;回到第1步继续读入下一行内容
6、当所有行都处理完之后,结束;
sed操作的所有数据都是pattern space缓存空间内的数据,原文件并没有发生该表。如果想保留sed操作后的数据,可以使用重定向符输出到新的文件中。或者使用- i参数更改原文件。
命令详解
命令格式:
sed [options] [commands] filename;
常用参数
x:指定行号
x,y:指定从x行到y行
/pattern/:指定包含模式的行
/pattern/,n:指定包含模式的行到第n行
p:打印匹配行
n:读取下一个输入行,用下一个命令处理新的行
a:在匹配行后面新的一行追加内容
i:在匹配行前面新的一行插入内容
d:删除匹配的行
c:用指定内容替代匹配的内容,一般操作多行
s:用指定内容替代匹配的内容,一般替代具体单词
常用参数实例
原文本
[root@jiangpeisi shell]# cat a.txt
mysql
appache
nginx
redis
memached
php
python
1.打印指定行内容
[root@jiangpeisi shell]# sed -n '1,3p' a.txt
mysql
appache
nginx
2.删除指定行
[root@jiangpeisi shell]# sed '/php/,$d' a.txt
mysql
appache
nginx
redis
memached
3.在指定行前后添加内容
[root@jiangpeisi shell]# sed '$a java' a.txt
mysql
appache
nginx
redis
memached
php
python
Java
[root@jiangpeisi shell]# sed '$i java' a.txt
mysql
appache
nginx
redis
memached
php
java
Python
4.替换指定内容
[root@jiangpeisi shell]# sed '2,3c java' a.txt
mysql
java
redis
memached
php
python
[root@jiangpeisi shell]# sed ‘s/php/java/‘ a.txt
mysql
appache
nginx
redis
memached
java
python
5.多个命令组合 使用;或者-e参数
[root@jiangpeisi shell]# sed -e '$a java' -e 's/php/java/' a.txt
mysql
appache
nginx
redis
memached
java
python
java
[root@jiangpeisi shell]# sed '/mysql/d ; s/php/java/' a.txt
appache
nginx
redis
memached
java
python
进阶参数
N:将当前读入行的下一行读取到当前的模式空间
h:将模式缓存区的文本复制到保持缓冲区
H:将模式缓冲区的文本追加到保持缓冲区
x:互换模式缓冲区和保持缓冲区的内容
g:将保持缓冲区的内容复制到模式缓冲区
G:将保持缓冲区的内容追加到模式缓冲区
两个缓冲空间pattern space与hold space。pattern space是一个临时缓冲区,用于保存当前读入的行信息,每处理完一行就会清除缓存内的信息,读取下一行。hold space 同样也是一个临时缓冲去,在处理行信息时,可以与pattern space之间进行互相拷贝。
进阶参数实例
1.在每一行后添加一个空行
[root@jiangpeisi shell]# sed '/^ $/p;G' a.txt
mysql
appache
nginx
redis
memached
php
python
2.将指定行的后一行与指定行合并为一行
[root@jiangpeisi shell]# sed '3N;s/\n/ /' a.txt
mysql
appache
nginx redis
memached
php
python