一、sed简介
在Linux/UNIX系统中包含很多种类的文本处理器或文本编辑器,其中包括其中包括我们之前学习过的VIM 编辑器与grep 等。而 grep,sed,awk 更是Shell 编程中经常用到的文本处理工具, 被称之为Shell 编程三剑客。
sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。
sed也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于Shell脚本中,用以完成各种自动化处理任务。
二、sed工作原理
一行一行处理的,当从文件中读取一行后,首先放到模式空间中对该行进行相应的处理,处理完将结果输出到屏幕上。然后继续读取下一行内容,直到所有行都读取完毕,sed结束。
三、sed基本参数
语法:
sed [选项] '模式动作' 文件...
选项:
-
-n:静默输出,关闭模式空间的输出,不会输出未匹配到的行 一般与p命令结合使用
-
-e:允许进行多项编辑,也就是说对同一行做多次处理、. 可以做多点编辑
-
-e '动作1' -e '动作2' == '动作1;动作2'
-
-f:后接sed脚本,指定执行的sed脚本(将模式动作写到文件中)
-
-r:允许使用扩展正则
-
-i:直接作用于原文件 没有输出 在使用-i之前一定先不加-i看看效果
-
-i.bak:修改原文件之前进行备份
模式:
-
空模式,表示所有的行都执行动作
-
以行号作为模式
1). 单独的行号
如:1 就是处理第1行
$ 处理最后一行
2). 起始行,结束行
如:1,5 处理第1到5行
3). 起始行~步长
每隔多少行操作一次
如:2~2 从第2行开始,每隔1行
4). 起始位置,+N
表示从起始位置开始,后面的N行都进行处理
如:3,+5 处理3-8行
-
以正则作为模式
1). /正则表达式/
如:/^root/
2). /正则表达式1/,/正则表达式2/
表示从第一次匹配到正则表达式1开始到第一次匹配到正则表达式2之间的所有行
如:/^bin/,/sh$/
动作-----处理命令: ! 非 : 放在命令前面表示取反
-
d 删除 delete
-
p 打印 print
-
r 读取 read
-
w 写 write
-
a 追加 在匹配的行下面插入内容 append
-
i 插入 在匹配行的上一行插入内容 insert
-
c 修改 本行替换 change
-
y 转换的命令,一一对应转换
-
n 处理下一行 next
-
q 退出,不会再向模式空间读入新的行 quit
-
s 查找替换
'模式s/旧的内容(正则表达式)/替换内容(新的内容)/[修饰符]'
修饰符:
g:全局替换
n:n为数字,1-512 替换第n个匹配到的内容
p:打印 -n
w:把处理过的行写入到另一个文件
四、使用示例
1.从以root开头的行,到以login结尾的行,将sbin替换为bin (/etc/passwd文件或其一部分)
sed -r -n '/root/,/login/s/sbin/bin/p' /etc/passwd
2.将格式为2014/08/17的日期,替换为2023; 02; 02这样的格式(注意:分号后面有空格)
date +"%Y/%m/%d"|sed 's/\//; /g'
3.将pass文件每行打印3次
sed 'p;p;' /tmp/pass
4.打印pass文件的第1行和第3行
sed -n '1p;3p;' /tmp/pass
5.删除pass文件的第一行和最后一行
sed '1d;$d' pass
6.删除pass文件中所有的数字
sed -r 's/[0-9]*//g' pass
7.去掉pass文件行首的.字符
sed-i 's/^.//g' pass
8.在pass文件行首添加一个a字符
sed 's/^/a/g' pass
9.在pass文件行尾添加一个a字符
sed 's/$/a/' 文件名