shell脚本学习之四剑客sed

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:将当前读入行的下一行读取到当前的模式空间
image_1d6fdc4i41r4rujbos01old5h23j.png-2.5kB
h:将模式缓存区的文本复制到保持缓冲区
image_1d6fdcepm13br129vmfuh7615sm40.png-3.4kB
H:将模式缓冲区的文本追加到保持缓冲区
image_1d6fdcn2u1iiv3gllj7mats94d.png-3.4kB
x:互换模式缓冲区和保持缓冲区的内容
image_1d6fdfb8cbj61u0a18rs1cfi5b470.png-2.8kB
g:将保持缓冲区的内容复制到模式缓冲区
image_1d6fdfjoi1u9qgts1hqp4701doo7d.png-3.3kB
G:将保持缓冲区的内容追加到模式缓冲区
image_1d6fdfom84pco1qehi1hvk1ua77q.png-3.5kB
两个缓冲空间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