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命令 – 连接两个文件

最后更新于