写在前面:本文参考https://www.cnblogs.com/ctaixw/p/5860221.html
sed:Stream Editor文本流编辑,sed是一个“非交互式的”面向字符流的编辑器。能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上。还可以对原文件改动,但是不会再屏幕上返回结果。
sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
1.sed命令的语法格式:
sed的命令格式: sed [option] 'sed command' filename
sed的脚本格式:sed [option] -f 'sed script' filename
2.sed命令的选项(option):
-n :只打印模式匹配的行
-e :直接在命令行模式上进行sed动作编辑,此为默认选项
sed 支持对单个文件实现不同的操作,每个操作用-e参数
-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作
-r :支持扩展表达式//正则
-i :直接修改文件内容
3.sed的编辑命令(sed command):
p
打印匹配行(和-n选项一起合用)
=
显示文件行号
a
新增,a的后面可以接字符串,而这些字符串会在新的一行出现,目前的下一行
i
插入,i的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行)
d
删除定位行
c
取代,c的后面可以街字符串,这些字符串可以取代n1,n2之前的行
w filename
写文本到一个文件,类似输出重定向 >
r filename
从另一个文件中读文本,类似输入重定向 <
s
取代,可以直接执行取代的工作,通常s的动作可以搭配正规比表示法,1,20s/old/new/g 搜寻并取代,g是取代所有匹配项目
q
第一个模式匹配完成后退出或立即退出
l
显示与八进制ACSII代码等价的控制符
{}
在定位行执行的命令组,用分号隔开
n
从另一个文件中读文本下一行,并从下一条命令而不是第一条命令开始对其的处理
N
在数据流中添加下一行以创建用于处理的多行组
g
将模式2粘贴到/pattern n/
y
传送字符,替换单个字符
详细请参考https://www.cnblogs.com/ctaixw/p/5860221.html
4.sed命令的一些实例
sed '/this/{s/^/shakalaka /g}' sedtest.txt //匹配this字符的行,行首添加shakalaka
sed '/1st/{s/^/wang &/}' sedtest.txt
在指定字符串之前添加内容,方法如下:
sed -i 's/指定的字符/要插入的字符&/' 文件
sed '/1st/{s/^/wang &/}' sedtest.txt
在指定的字符串之后添加内容
sed -i 's/指定的字符/&要插入的字符/' 文件
其中的&相当于被指定的字符串
1."^"代表行首,"$"代表行尾
2.'s/$/&tail/g'中的字符g代表每行出现的字符全部替换,如果想在特定字符处添加,g就有用了,否则只会替换每行第一个,而不继续往后找。
重点:sed命令实现对文件内容的替换(替换是在shell自动化脚本中用到最多的操作)
sed -i '/Ethernet/r myfile' test
#在匹配Ethernet的行,读进来另一个文件的内容,读进来的文件的内容会插入到匹配Ethernet的行后。
# sed -i '/DEVICE/cEthernet' test
用新文本替换定位文本,整行的替换
#匹配DEVICE的行,替换成Ethernet这行
# sed -i 's/static/dhcp/' test
#把static替换成dhcp(/,@,#都是前面所说的地址定界符)
# sed -i '/IPADDR/s@22.1@10.12@' test
sed -i '/IPADDR/s/22.1/10.12/' sedtest.txt
#匹配IPADDR的行,把22.1替换成10.12由于.号有特殊意义所有需要转义
# sed -i '/connect/s#YES#NO#' test
#匹配connect的行,把YES替换成NO
# sed -i 's/bin/tom/2g' test
#把所有匹配到bin的行中第二次及第二次之后出现bin替换成tom
# sed -i 's/daemon/jerry/2p' test
#把所有匹配到bin的行中第二次出现的daemon替换成jerry,并在生成与匹配行同样的行
# sed -i 's/adm/boss/2' test
#把所有匹配到adm的行中仅仅只是第二次出现的adm替换成boss
sed -i -e '/root/s/bash/nologin/' -e'/root/s/1/0/g' sedtest.txt
sed支持单个文件实现不同的操作,每个操作用-e
#匹配root的行,把bash替换成nologin,且把0替换成1
# sed -i 's/root/(&)/g' test
#把root用括号括起来,&表示引用前面匹配的字符
# sed -i 's/BOOTPROTO/#BOOTPROTO/' test
#匹配BOOTPROTO替换成#BOOTPROTO,在配置文件中一般用于注释某行
# sed -i 's/ONBOOT/#&/' test