一、sed介绍:
sed(Stream Editor)是一种流编辑器,用于对文本进行处理和转换。它可以从输入流中读取文本,并根据指定的规则进行编辑和替换。sed通常用于在命令行中进行文本处理,可以实现搜索、替换、删除、插入等操作。
工作流程:
seq 的工作流程主要包括读取、执行和显示三个过程。
默认情况下所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非使用 "sed -i" 修改源文件、或使用重定向输出到新的文件中。
二、基本用法:
语法有如下三种:
sed [option]... 'script;script;...' [input file...]
选项 自身脚本语法 支持标准输入管道
选项:
-e —— 用指定命令或者脚本来处理输入的文本文件,只有一个操作命令时省略,一般在执行多个操作命令使用
-f ——用指定的脚本文件来处理输入的文本文件
-n ——不输出模式空间内容到屏幕,即不自动打印,可以与 p 命令一起使用完成输出
-r -E ——使用扩展正则表达式
-h ——显示帮助
-i ——直接修改目标文件
-i.xxx ——备份文件并原处编辑
-s ——将多个文件视为独立文件,而不是单个连续的长文件流
操作符:
“操作”用于指定文件对操作的动作行为,也就是 sed 的命令。
通常情况下是采用的 “[n1[,n2]]” 操作参数的格式。n1、n2是可选的,代表选择进行操作的行数,如操作需要在5~20行之间进行,则表示为 “5,20 动作行为”
s 替换,替换指定字符
d 删除,删除选定的行
a 增加,在当前行下方增加一行指定内容
i 插入,在选定行上方插入一行指定内容
c 替换,将选定行替换为指定内容
w 保存模式匹配的行至指定文件
r 读取指定文件的文本至模式空间中匹配的行后
y 字符转换,转换前后的字符长度必须相同
p 打印行内容。如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与"-n"选项一起使用
= 打印行号
l(小写L) 打印数据流中的文本和不可打印的ASCII字符(如结束符$ 制表符\t)
脚本格式:
由 ‘地址+命令’ 组成
不给地址 对全文进行处理
单地址 :
数字 指定的数字行
$ 最后一行
地址范围:
x,x 从第x行到第x行 3,6 从第3行到第6行
x,+x 从x行到+x行 3,+4 从3行到第7行
/pat1/,/pat2/ 第一个正则表达式和第二个正则表达式之间的行
步进 ~ :
1~2 奇数行
2~2 偶数行
n;打印下一行
1.打印内容 :
1.1打印全部内容:
sed ' ' #交互模式输入一行,自动打印一行相同的
sed -n ' ' #交互模式输入一行,关闭自动打印
sed -n ' p' #加上p又恢复自动打印,与sed ' '相同
1.2查看文件打印全部内容:
sed ' ' /etc/fstab
sed -n ' p' /etc/fatab
1.3打印指定内容:
sed -n '4p' /etc/fstab
#打印第四行内容
1.4打印指定多行内容 :
ifconfig ens33 |sed -n '2,4p'
#打印网卡信息的2至4行
cat -n /etc/passwd |sed -n '2,+4p'
#打印第2至6行,即第二行开始往后四行
1.5打印多行内容后退出:
sed '3q' /etc/passwd
#打印三行后退出
1.6 打印最后一行,使用通配符$:
sed -n '$p' /etc/passwd
1.7 支持正则表达式,打印范围内容:
sed -n '//,//p' 文件名
#第一个//表示开头位置,第二个//表示结尾位置
sed -n '/^r/,/^f/p' /etc/passwd
#以r开头 f开头结尾 第二轮以r开头 后面没有以f开头结尾 则显示全部
1.8过滤关键字
sed -n '/root/p' /etc/passwd
#从第二行开始,找到root为止
sed -n '2,/root/p' /etc/passwd
#从第二行开始,找到root为止
1.9 打印奇数偶数行:
seq 10 |sed -n '1~2p'
seq 10 |sed '2~2d'
#打印奇数行
seq 10 |sed -n '2~2p'
seq 10 |sed '1~2d'
#打印偶数行
1.10 指定r开头f结尾的行:
1.11 打印某个时间段的文件:
2.插入内容:
2.1在指定行下方增加一行指定内容:
2.2 在指定行下方\n插入内容:
2.3 在指定行前插入内容:
2.4 将seq2.txt文件内容放到第二行后面:
3.删除内容:
3.1删除指定行:
#删除指定行并不是真正删除,只是将删除了的结果显示出来,并不是真正删除了
cat 1.txt |sed '3d'
#删除第三行并显示出来
3.2 指定删除多行:
sed '2,4d' seq.txt
#删除连续的2到4行
3.3删除空行:
sed '/^$/d' 文件名
3.4删除以指定字符结尾的行:
sed '/nologin$/!d' /etc/passwd
#删除不是以nologin结尾的行
3.5备份在删除:
sed -i.bak '3d' 1.txt
#原文件删除第三行,并原文备份
查看备份文档:
4. 替换内容:
4.1在指定行下方替换指定内容:
5.! 取反:
6.显示内容:
6.1换行显示行号:
6.2显示第二行内容:
三、搜索替代:
格式:
sed 行范围 s/旧字符串/新字符串/替换标记
替换标记:
数字:表明新字符串将替换第几处匹配的地方
g : 表明新字符串将会替换所有匹配的地方
p : 打印与替换命令匹配的行,与 -n 一起使用
w 文件 :将替换的结果写到文件中
& 指代之前找到的内容
1.修改selinux开机不自启配置文件:
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
2.修改多行,使用r 以及-e
sed -ri -e 's/SELINUX=disabled/SELINUX=enabled/' /etc/selinux/config -e 's/SELINUXTYPE=targeted/SELINUXTYPE=111/' /etc/selinux/config
1.2修改全局,后面加g:
sed -i 's/root/admin/g' /etc/passwd
#将全局出现的root修改为admin
1.3 指代变量:
&指代之前找到的内容
四、分组调用:
1.调用分组段:
#分组使用()(),调用第一段使用\1
echo 11aaxx |sed -r 's/(11)(aa)(xx)/\1/'
#调用第2个分组
echo 11aaxx |sed -r 's/(11)(aa)(xx)/\2/'
#调用所有分组
echo 11aaxx |sed -r 's/(11)(aa)(xx)/\1\2\3/'