3.处理字符 sed
① sed 默认情况下不会修改原文件内容
② sed 是一种非交互式的编辑器
3.1 工作原理
将原文件一行一行的进行处理,取出一行,放入“模式空间进行处理”,处理完成之后将结果输出到屏幕上,然后读取下一行,重复处理操作,直到所有行都读取处理完毕。
==> 因此,当sed处理字符时,不添加任何选项和条件,则会将原文件内容,完整输出到屏幕中。
例:sed ' ' /etc/group 会将/etc/group 全部输出一遍
3.2 用法
sed [选项] '模式 动作' 文件...
选项:相当对整个字符处理定大基调
-n :静默,关闭模式空间的输出,不会将未匹配到的行进行输出;
-e :允许进行多项编辑,在一个sed语句中,进行多次处理;
写法1: -e '动作1' -e '动作2'
写法2: '动作1;动作2'
-f :后接sed脚本,指定执行的sed脚本(将模式动作写到文件中)
-r :允许使用拓展正则
-i :直接作用到文件,没有输出,欲使用时先不加-i看一下输出效果
-i.bak :修改原文件之前进行备份
模式:相当于对原文件匹配范围
1.空模式:表示所有的行都执行
2.以行号作为模式:
2.1> 单独行
2.2> 起始行,结束行
2.3> 起始行~步长
2.4> 起始行+N
3.以正则过滤作为表达式,
3.1> /正则表达式/
3.2> /正则表达式1/,/正则表达式2/
==> 表示从匹配到正则表达式1开始,到匹配到正则表达式2之间的所有行
例如:/^root/,/sync$/
动作:对模式匹配到的行进行操作
d :删除
p :打印
r : 读取
w:写入
a :追加 // 在匹配到的下一行追加
i :插入 // 在匹配到的上一行插入
c :修改 // 整行替换
y :转换的命令 // 一 一 对应的转换,类似tr
sed '1 y/HAPY/hapy/' 6.1.txt ==> 将文件6.1.txt 中第1行的所有HAPY 转换为 hapy
n :处理下一行
s :替换查找
用法: ' 模式 s/[旧的内容(正则表达式)]/[替换的内容]/[修饰符]'
修饰符: g 全局替换 p 打印 w 把处理过的行写入到文件中
示例1:
打印出/etc/passwd文件中的第5行
分析:首先静默其它输出 -n 行号模式 5 动作 p 打印
sed -n '5 p' /etc/passwd
示例2:
只打印/etc/passwd 文件的第5行和第10行
分析: 用选项-n 静默其他输出,用;(或者-e)进行多次打印p操作
sed -n '5 p; 10 p' /etc/passwd
示例3:
在/etc/passwd下,从以root开头的行,到以login结尾的行,将sbin替换为bin
分析:范围替换用正则表达式进行匹配,s///进行替换,p将替换的行打印出
sed -n '/^root/,/login$/ s/sbin/bin/gp'
示例4:
cp /etc/group /opt
修改 /opt/group 文件,将文件的所有小写替换为大写
分析:s/[a-z]/\u&/g ==> 将所有的小写替换为大写,g全局替换
-i ==> 修改文件内容,直接作用到文件
sed -i 's/[a-z]/\u&/g' /opt/group
把文件的小写字母替换为大写字母? 固定写法
s/[a-z]/\u&/g
把文件的大写字母替换为小写字母? 固定写法
s/[A-Z]/\l&/g