1.概述
sed是Linux中的一个强大工具,被称为Stream Editor(流编辑器),也简称为sed。它是一个用于操作、过滤和转换文本内容的工具,能够结合正则表达式对文件实现快速增删改查。sed的主要功能包括过滤指定字符串、取出指定行等,是Linux系统中处理文本文件的常用命令之一。
2.使用详解
1)sed命令的作用
·取行,过滤,替换修改文件的内容
·后向引用
2)sed的格式
sed -n '3p' test.txt:取出test.txt第三行
-n:表示取消默认输出(不加-n输出全部内容)
p:表示输出
-r:sed支持拓展正则
-i:实际修改文件,放在最后(例如:-ri)
-i.bak:先备份,再修改,放在最后(例如:-ri.bak)
3)sed查找
类似grep的过滤,比grep强再可以指定行号
案例1:取出文件test.txt第5行
sed -n '5p' test.txt(使用p时才必须加-n)
案例2:取出文件test.txt第1行到第3行
sed -n '1,3p' test.txt(行号根据顺序,不可3,1)
案例3:取出文件test.txt中包含hello的行
sed -n '/hello/p' test.txt
案例4:获取test.txt中一定范围内的日志
例如202401-202408之间
sed -n '/202401/,/202408/p' test.txt
注:取范围的时候,条件尽可能精确,避免出现由于条件模糊,导致取的范围错误
案例5:只查看test.txt中第2行和第4行
sed -n '2p ; 4p' test.txt
4)sed修改、替换
案例1:把test.txt中hello修改为word
sed 's#hello#word#g' test.txt
第一二井号之间表示找谁,第二三井号表之间示修改为什么
s:表示substitute:替换
g:表示globl:全局替换(不加g,只替换每一行第一个)
注:此举只修改sed输出后的结果,实际并未修改
sed -i 's#hello#word#g' test.txt(实际修改,如果需要实际修改要加-i)
s###g 可以换为 s@@@g、s///g
案例2:备份test.txt文件为test.txt.bak(原始文件),把test.txt中hello实际修改为word
sed -i.bak 's#hello#word#g' test.txt
案例3:将test.txt文件全部内容前加<,文件全部内容后加>
sed -r 's#(.*)#<\1>#g' test.txt(后向引用也叫反向引用)
.*:表示全部
\1:表示前面(.*)中匹配到的内容,多个条件还表示取出第一组条件内容
(.*):表示条件,多个条件可以使用多个()
案例4:后向引用
1 2 3 4 5 6 7 8 9 10
上面数字为文件test.txt内容,需要将每个数字两边加上<>,例如<1>
sed -r 's#([0-9]+)#<\1>#g' test.txt
实际例子:调换test.txt中第一列和最后一列内容
root:a;1:1:root:/root:/bin/bash bin:a;2:2:bin:/bin:/sbin/nologin adm:a;3:3:adm:/var:/adm:/sbin/nologin(此为test.txt内容)
(^.)(:a.:)(.$) 解释:
.表示全部
^表示开头
^.:a这个表示从开头到:a结束即root:a
^.:a.:这个表示从开头到最后一个:即root:a;1:1:root:/root:
.$表示末尾全部即/bin/bash
最后进行分组,
第一列为rout,在:a前,即(^.)
中间组在最后一个:前,即(:a.:)
最后一列为/bin/bash,即(.*$)
3个组分别对应\1,\2,\3
调换后最终为:
sed -r 's#(^.)(:a.:)(.*$)#\3\2\1#g' test.txt
实际修改后为:
sed -ir 's#(^.)(:a.:)(.*$)#\3\2\1#g' test.txt
5)sed删除
案例一:删除test.txt的第2行(非实际删除)
sed '3d' test.txt
d:删除
案例二:删除test.txt文件中的空行和带注释的行
sed -r '/^$|#/d' test.txt
6)sed增加
案例一:在test.txt的第2行下增加一行:12345,6789
sed '3a 12345,6789' test.txt
a:append在指定行下一行增加
案例二:在test.txt的第2行上增加一行:12345,6789
sed '3i 12345,6789' test.txt
i:insert在指定行上一行增加
案例三:将test.txt的第2行替换为:12345,6789
sed '3c 12345,6789' test.txt
c:replace对指定行进行替换