sed命令–处理编辑文本文件
Linux sed 命令是利用脚本来处理文本文件。sed 可依照脚本的指令来处理、编辑文本文件。sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
语法格式:sed [参数]
-e或--expression=<script>
以选项中指定的script来处理输入的文本文件
-f<script文件>或--file=<script文件>
以选项中指定的script文件来处理输入的文本文件
-h或--help
显示帮助
-n或--quiet或--silent
仅显示script处理后的结果
-V或--version
显示版本信息
-i
修改原文件
-i.bak
在做修改的同时将原文件备份一份,备份的文件名为 oldName.bak
a
在当前行下面插入文本。
i
在当前行上面插入文本。
c
把选定的行改为新的文本。
d
删除,删除选择的行。不指定范围则删除所有
D
删除模板块的第一行。
s
替换指定字符
-r
在脚本中使用扩展正则表达式
sed替换标记
g
表示行内全面替换。
p
表示打印行。
w
表示把行写入一个文件。
x
表示互换模板块中的文本和缓冲区中的文本。
y
表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\1
子串匹配标记
&
已匹配字符串标记
sed元字符集
^
匹配行开始,如:/^sed/匹配所有以sed开头的行。
$
匹配行结束,如:/sed$/匹配所有以sed结尾的行。
.
匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
*
匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[]
匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。
[^]
匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
(..)
匹配子串,保存匹配的字符,如s/(love)able/\1rs,loveable被替换成lovers。
&
保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
<
匹配单词的开始,如:/<love/匹配包含以love开头的单词的行。
>
匹配单词的结束,如/love>/匹配包含以love结尾的单词的行。
x{m}
重复字符x,m次,如:/0{5}/匹配包含5个0的行。
x{m,}
重复字符x,至少m次,如:/0{5,}/匹配至少有5个0的行。
x{m,n}
重复字符x,至少m次,不多于n次,如:/0{5,10}/匹配5~10个0的行。
参考实例
在file文件的第四行后添加一行,并将结果输出到标准输出:
sed -e 4a\newline file
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
newline 将 /dir 的内容列出并且列印行号,同时删除第 2~5 行:
nl /dir | sed '2,5d'
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown在第二行后面加入两行字,例如 Drink tea or ….. 与 drink beer:
nl /dir | sed '2a Drink tea or ......\
> drink beer ?'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
Drink tea or ......
drink beer ?
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin将第2-5行的内容取代成为No 2-5 number:
nl /dir | sed '2,5c No 2-5 number'
1 root:x:0:0:root:/root:/bin/bash
No 2-5 number
6 sync:x:5:0:sync:/sbin:/bin/sync以行为单位的显示:
nl /dir | sed -n '5,7p'
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
# 显示第5到最后一行的内容
sed -n '5,\$p' filename
# 显示除第1到第一5行的所有内容
sed -n '1,5!p' filename用sed命令在文件指定行加入内容
sed -i "1i\aaa" filename # 在filename第一行加入内容,如果有这一行,则原本行下称
sed -i "3i\bbb" filename # 在filename第三行加入bbb
sed -i.bak "3i\bbb" filename # 修改原文件的同时对原文件进行备份文本内容如下:
aaa bbb ccc 111 222 abc
eee fff ggg 111 222 efg
111 222
aaa ccc ddd 111 222 acd删除指定行
sed -i 2d filename # 删除第2行
sed -i "2,5d" filename # 删除第2到第5行
sed -i "2d;4d;8d" filename # 删除第2、4、8行
sed -i "$d" filename # 删除最后一行
sed -i "3,6!d" filename # 删除除第三到第六行外的其它行
sed -i "/^$/d" filename # 删空行
sed -i '/^\s*$/d' file # 删除包含空白字符的空行
sed '/指定字符串/q' filename # 删除‘指定字符串’后面的所有行需求: 在有aaa的行中,将 111 替换为 AAA,将 222 替换为 BBB 即,输出结果为:
aaa bbb ccc AAA BBB abc
eee fff ggg 111 222 efg
111 222
aaa ccc ddd AAA BBB acd方法如下:
sed -i '/aaa/ { s/111/AAA/g; s/222/BBB/g; }' filename有多个替换选项,可以用-e参数
# 把所有1替换成2,把包含aaa行 22替换成cc,把包含bbb行中的33替换成ee
sed -i -e "s/1/2/g" -e "/aaa/ {s/22/cc/g}" -e "/bbb/ {s/33/ee/g}" filename注释指定行
# 在第一行前面插入#,实现注释目的
sed -i '1 s/^/#/' filename
# 同时注释多个用-e参数
sed -i -e '3 s/^/#/' -e '6 s/^/#/' filename
# 注释第7到最后一行的连续行
sed -e '7,$ s/^/#/' filename
# 注释7-9连续行
sed -e '7,9 s/^/#/' filename替换指定行中的部分字符
sed -i '2s/aaa/bbb/' filename # 将第2行中的aaa替换为bbb
sed -i '2,4/aaa/bbb/' filename # 将第2到4行中的aaa替换为bbb
替换指定开头行的所有内容
cat test2.txt
No;Name;Mark;Percent
01;tom;69;91
02;jack;71;87
03;alex;68;98
# 将以‘01’开头的全部行(不需要全部内容匹配)替换成abc。可以用于修改配置文件中的地址、端口这些不固定的信息
sed "/^01/c abc" test2.txt
No;Name;Mark;Percent
abc
02;jack;71;87
03;alex;68;98
# 如果要插入的内容前面有空格,需要用\来转义,不然空格会忽略
cat sed.txt
| Alias admin |
sed '/Alias admin/c Alias chao'
Alias chao
# c后面加了多个空格也会自动忽略
sed '/Alias admin/c Alias chao'
Alias chao
# c后面用\开头,就会保留空格
sed '/Alias admin/c\ Alias chao'
Alias chao
# 替换/删除每行开头的指定字符数量, 一个.表示一个字符
sed 's/^.//' file
# 替换/删除每行开头的20个字符,-r表示使用正则,不然20个.得数好久了。
sed -r 's/^.{20}//' file
# 替换/删除所有行尾三个字符
sed -r 's/.{3}$//' file截取指定时间范围的内容
文件中需要有类似如下的时间记录开头
2022-04-12 13:30:39.832 INFO 9 --- [nio-8080-exec-6] com.jiaparts.basic.log.aspect.LogAspect : # 截取8点到9点之间的信息打印到屏幕,后面可以接重定向写入其它文件
sed -n '/2022-04-12 08:00/,/2022-04-14 09:00/'p多行替换
把
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]替换成
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."172.25.0.50"]
endpoint = ["http://172.25.0.50"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."172.25.0.50".insecure]
skip_verify = true
[plugins."io.containerd.grpc.v1.cri".registry.configs."172.25.0.50".auth]
username="admin"
password="Harbor12345"
示例:
sed -i 's# \[plugins."io.containerd.grpc.v1.cri".registry.mirrors\]# \[plugins."io.containerd.grpc.v1.cri".registry.mirrors\]\n \[plugins."io.containerd.grpc.v1.cri".registry.mirrors."172.25.0.50"\]\n endpoint = \["http:\/\/172.25.0.50"\]\n \[plugins."io.containerd.grpc.v1.cri".registry.mirrors."172.25.0.50".insecure\]\n skip_verify = true\n \[plugins."io.containerd.grpc.v1.cri".registry.configs."172.25.0.50".auth\]\n username="admin"\n password="1Harbor1234523"#' /etc/containerd/config.toml
与该功能相关的Linux命令:
rmdir命令 – 删除空目录 ed命令 – 文本编辑 tempfile命令 – 临时文件命名 jed命令 – 编辑文本文件 ispell命令 – 用于拼写检查程序 rm命令 – 移除文件或目录 vi命令 – 文本编辑器 nano命令 – 字符终端文本编辑器 head命令 – 显示文件开头内容 join命令 – 连接两个文件
最后更新于