sed 是文本处理工具,读取文本内容,根据指定的条件进行处理,如删除、替换、添加等;可在无交互的情况下实现相当复杂的文本处理操作
工作原理:读取👉执行👉显示
读取:sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区(又称模式空间,pattern space)
执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完之前上述过程将重复执行
注:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非使用 ''sed -i" 修改文件源、或使用定向输出到新的文件中
sed 命令是一种流编辑器读取文件会进行逐行读取加上指令操作,所以过大的文件一定要拆分后再交给sed处理
基本操作格式:
sed-e '操作' 文件1 文件2
执行多条命令的格式:
sed-e '操作1' -e '操作2' 文件
sed命令的常用选项
-e 或--expression==:表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用
-f 或 --file==:表示指定的脚本文件来处理输入的文本文件
-h 或--help: 显示帮助
-i 直接修改目标文本文件
-n 仅显示script处理后的结果
sed命令的操作符
s:替换,替换指定字符
d:删除,删除选定的行
a:增加,在当前行下面增加一行指定内容
i:插入,在选定行上面插入一行指定内容
c:替换,将选定行替换为指定内容
y:字符转换,转换前后的字符长度必须相同
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与 "-n" 选项一起使用
r:高级正则表达式
加上p,会打印两行
-n 禁止了默认输出,就只有一行
打印时对行号的操作
按照行号寻求内容
sed -n '1p' 文件名 --打印第一行
sed -n '4p' 文件名 --打印第四行
sed -n '$p' 文件名 --打印最后一行
进行行号范围区间的打印
sed -n '1,3p' 文件名 --打印1-3行
sed -n '5,$p' 文件名 --打印第五行到最后一行
sed -n '2,+2p' 文件名 -- 打印第二行+两行的内容,相当于'2,4p'
指定间隔打印
sed -n -e '2p' -e'$p' 文件名 --打印第二行和最后一行
sed -n -e '2p' -e'3p' 文件名 --打印第二行和第三行
对奇数和偶数行的打印
sed -n 'n;p' 文件名 --打印偶数的行
sed -n 'p;n' 文件名 -- 打印奇数的行
这里的n 就是指定高级模式的意思,n在p前面,跳过一行,打印下一行,就是偶数行;在后面,就是打印第一行,然后跳过一行,形成奇数行
文本模式过滤行内容
对包含的字符串进行过滤打印
sed -n '/o/p' 文件名 --包含o的所有行
sed -n '/th/p' 文件名 --包含th的所有行
应用基础正则表达式进行打印
sed -n '/^root/p' /etc/passwd --以root为开头的所有内容,全文本搜索
sed -n '/bash$/p' /etc/passwd --以bash结尾的所有内容,全文本搜索
sed -n '4,/bash$/p' /etc/passwd --从第四行开始,一直打印到第一个以bash为结尾的所在行
删除操作
sed -i 时会对文本进行实际操作
通过行号进行删除
sed -n '3d;p' 文件名 --删除第三行,打印剩余的所有内容
sed -n '2,5d;p' 文件名 --删除第2到5行,打印剩余的内容
sed -n '5,$d;p' 文件名 --删除第5行到最后一行,打印剩余的内容
sed -n '5,$!d;p' 文件名 -- 打印第5行到最后一行,其他的全部删除
匹配字符串删除内容
sed '/one/d' 文件名 ---删除包含one的行
sed '/one/,/six/d' 文件名 --删除one -six的行
sed '/one/,/six/!d' 文件名 ---删除除了one-six的行,其余的全部删除
sed '/one/!d' 文件名 --除了one的行,其余的全部删除
字符串搭配正则进行删除
sed '/^$/d' 文件名 --通过^$,来删除空行;
替换
替换标记
数字:表明新字符串将替换第几处匹配的地方
g:表明新字符串将会替换所有匹配的地方
p:打印与替换命令匹配的行,与-n一起使用
w文件:将替换的结果写入文件中
s:替换,替换指定字符
c:替换,将选定行替换为指定内容
y:字符转换,转换前后的字符长度必须相同
sed -n 's/root/test/2p' 文件名 ---指定每行的第二个root,替换为test
sed -n 's/root/test/gp' 文件名 ---所有的root都替换为test
sed -n '/^root/ s/^/#/p' 文件名 --以root开头的注释掉
字母字符进行大小写的替换
sed 's/[A-Z]/\l&/g' 文件名 --将大写全部转换成小写,l&是转换小写的一种特殊的符号,前面要加转义符 '\'
sed 's/[a-z]/\u&/' 文件名 ---首字母大写
sed 's/[a-z]/\u&/g' 文件名 ---末尾加g ,全部转成大写
整行替换
sed '/one/c rr' 文件名 --所有包含one 的行,整行被替换成rr
单字符的替换
使用有y,是对单个字符进行替换,每个字符都需要逐一对应,不是整体替换。前后字符串长度需要一致,不然会报错
sed 增加
a:在行后添加内容
sed /one/a zzz 文件名
i:在行前插入内容
sed /one/i zzz 文件名
r:在行后读入文件内容
sed '$r test2.txt' test1.txt ---先读取test2.txt的内容,再把test2 .txt的所有内容插入到test1.txt的末行