如何使用sed进行文本处理操作?

2026-05-22 06:061阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2453个文字,预计阅读时间需要10分钟。

如何使用sed进行文本处理操作?

Sed 是 Stream Editor 的缩写,与 vi 不同,sed 是行编辑器。官网:http://sed.sourceforge.net/

sed 从文件或管道中读取一行,处理该行,然后输出该行;再读取下一行,处理,输出,直至最后一行。每处理一行,称为处理一次。

如何使用sed进行文本处理操作?

sed 即 Stream EDitor,和 vi 不同,sed是行编辑器
官网:sed.sourceforge.net/

Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(PatternSpace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快
帮助参考网站: www.gnu.org/software/sed/manual/sed.html

sed基本用法
格式:

sed [option]... 'script;script;...' [inputfile...]

常用选项:

-n 不输出模式空间内容到屏幕,即不自动打印 -e 多点编辑 -f FILE 从指定文件中读取编辑脚本 -r, -E 使用扩展正则表达式 -i.bak 备份文件并原处编辑 -s 将多个文件视为独立文件,而不是单个连续的长文件流 #说明: -ir 不支持 -i -r 支持 -ri 支持 -ni 会清空文件

script格式:

'地址+命令'

地址格式:

1. 不给地址:对全文进行处理 2. 单地址: #:指定的行,$:最后一行 /pattern/:被此处模式所能够匹配到的每一行 3. 地址范围: #,# 从#行到第#行, 如3,6 从第3行到第6行 #,+# 从#行到+#行, 如3,+4 表示从3行到第7行 /pat1/,/pat2/ #,/pat/ /pat/,# 4. 步进:~ 1~2 奇数行 2~2 偶数行

命令:

p 打印当前模式空间内容,追加到默认输出之后 Ip 忽略大小写输出 d 删除模式空间匹配的行,并立即启用下一轮循环 a [\]text 在指定行后面追加文本,支持使用\n实现多行追加 i [\]text 在行前面插入文本 c [\]text 替换行为单行或多行文本 w file 保存模式匹配的行至指定文件 r file 读取指定文件的文本至模式空间中匹配到的行后 = 为模式空间中的行打印行号 ! 模式空间中匹配行取反处理 q 结束或退出sed

查找替换

s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s### 修饰符: g 行内全局替换 p 显示替换成功的行 w /PATH/FILE 将替换成功的行保存至文件中 I,i 忽略大小写

范例:

[root@centos7 ~]# sed -n '' /etc/redhat-release # -n 屏蔽默认输出 [root@centos7 ~]# sed '' /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [root@centos7 ~]# sed -n 'p' /etc/redhat-release # 'p' 打印行 CentOS Linux release 7.9.2009 (Core) [root@centos7 ~]# ifconfig eth0 | sed -n '2p' #打印第二行 inet 10.0.24.17 netmask 255.255.252.0 broadcast 10.0.27.255 [root@centos7 ~]# sed -n '$p' /etc/passwd #打印末行 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin #打印倒数第二行 [root@centos7 ~]# sed -n "$(echo $[`cat /etc/passwd | wc -l` -1])p" /etc/passwd wang:x:2006:2007::/home/wang:/bin/nologin #查看现有分区及挂载情况 [root@centos7 ~]# df | sed -n '/^\/dev\/sd/p' /dev/sda1 82437508 6128756 72853288 8% / #打印奇数行(从第一行开始,步长为2) [root@centos7 ~]# seq 10 | sed -n '1~2p' 1 3 5 7 9 #打印偶数行(从第二行开始,步长为2) [root@centos7 ~]# seq 10 | sed -n '2~2p' 2 4 6 8 10 #多点编辑删除第二行和第四行 [root@centos7 ~]# seq 5 | sed -e '2d' -e '4d' 1 3 5 [root@centos7 ~]# seq 5 | sed '2d;4d' 1 3 5 #安装httpd以获得配置文件httpd.conf [root@centos7 ~]# rpm -qi httpd || yum install -y httpd #删除配置文件中的空行和#开头的注释行: [root@centos7 ~]# sed '/^#/d;/^$/d' /etc/httpd/conf/httpd.conf [root@centos7 ~]# grep -Ev '^#|^$' /etc/httpd/conf/httpd.conf #修改网卡命名规则为eth0,eth1的形式 [root@centos7 ~]# sed -Ei.bak '/^GRUB_CMDLINE_LINUX/s/(.*)(")$/\1net.ifnames=0\2/' /etc/default/grub

搜索替换和&

#后向引用 [root@centos7 ~]# sed -nr 's/r..t/&@@/gp' /etc/passwd # &等于/r..t/的匹配结果 root@@:x:0:0:root@@:/root@@:/bin/bash operator:x:11:0:operator:/root@@:/sbin/nologin ftp:x:14:50:FTP User:/var/ft@@p:/sbin/nologin

范例:获取分区利用率

[root@centos7 ~]# df | sed -En '/^\/dev\/sd/s@.* ([0-9]+)%.*@\1@p' [root@centos8 ~]#df | sed -nr '/^\/dev\/sd/s# .* ([0-9]+)%.*# \1#p' /dev/sda2 3 /dev/sda5 1 /dev/sda1 14 [root@centos8 ~]#df | sed -rn '/^\/dev\/sd/ s#([^[:space:]]+[[:space:]]+){4}(.*)%.*#\2#p' 3 1 19 [root@centos8 ~]#df | sed -rn '/^\/dev\/sd/ s#(\S+\s+){4}(.*)%.*#\2#p' 3 1 19

范例:取IP地址

[root@centos7 ~]# ifconfig eth0 | sed -nr "2s/[^0-9]+([0-9.]+).*/\1/p" 10.0.0.8 [root@centos7 ~]# ifconfig eth0 | sed -rn '2s/^[^0-9]+([0-9.]+) .*$/\1/p' 10.0.0.8 [root@centos7 ~]# ifconfig eth0 | sed -rne '2s/^.*inet //' -e 's/netmask.*//p' 10.0.0.8 [root@centos7 ~]# ifconfig eth0 | sed -n '2s/^.*inet //;s/ netmask.*//p' 10.0.0.8 [root@centos7 ~]# ifconfig eth0 | sed -rn '2s/(.*inet )([0-9].*)(netmask.*)/\2/p' 10.0.0.8

范例:取路径中的基名和目录名

#取目录名 [root@centos7 ~]# echo /etc/sysconfig/network | sed -rn 's#(.*)/([^/]+)/?#\1#p' /etc/sysconfig #取基名 [root@centos7 ~]# echo /etc/sysconfig/network | sed -rn 's#(.*)/([^/]+)/?#\2#p' network

范例:取文件的前缀和后缀

[root@centos7 ~]# echo a.b.c.gz|sed -En 's/(.*)\.(.*)$/\1/p' a.b.c [root@centos7 ~]# echo a.b.c.gz|sed -En 's/(.*)\.(.*)$/\2/p' gz [root@centos7 ~]# echo a.b.c.gz|sed -En 's/(.*)\.([^.]+)$/\1/p' a.b.c [root@centos7 ~]# echo a.b.c.gz|sed -En 's/(.*)\.([^.]+)$/\2/p' gz [root@centos7 ~]# echo a.b.c.gz | grep -Eo '[^.]+$' gz

范例:将非#开头行注释

[root@centos8 ~]# sed -rn "s/^[^#]/#&/p" /etc/fstab [root@centos8 ~]# sed -rn 's/^[^#](.*)/#\1/p' /etc/fstab [root@centos8 ~]# sed -rn '/^#/!s@^@#@p' /etc/fstab

范例:修改内核参数

[root@centos7 ~]# sed -nr '/^GRUB_CMDLINE_LINUX/s/"$/ net.ifnames=0"/p' /etc/default/grub GRUB_CMDLINE_LINUX="crashkernel=auto console=ttyS0 console=tty0 panic=5 net.ifnames=0 biosdevname=0 intel_idle.max_cstate=1 intel_pstate=disablenet.ifnames=0 net.ifnames=0" [root@centos7 ~]# sed -rn '/^GRUB_CMDLINE_LINUX=/s@(.*)"$@\1 net.ifnames=0"@p' /etc/default/grub GRUB_CMDLINE_LINUX="crashkernel=auto console=ttyS0 console=tty0 panic=5 net.ifnames=0 biosdevname=0 intel_idle.max_cstate=1 intel_pstate=disablenet.ifnames=0 net.ifnames=0" [root@centos7 ~]# sed -rn '/^GRUB_CMDLINE_LINUX=/s@"$@ net.ifnames=0"@p' /etc/default/grub GRUB_CMDLINE_LINUX="crashkernel=auto console=ttyS0 console=tty0 panic=5 net.ifnames=0 biosdevname=0 intel_idle.max_cstate=1 intel_pstate=disablenet.ifnames=0 net.ifnames=0"

范例:修改网卡名称

#centos7、8 [root@centos8 ~]# sed -i '/GRUB_CMDLINE_LINUX=/s#quiet#& net.ifnames=0#' /etc/default/grub [root@centos8 ~]# sed -ri '/^GRUB_CMDLINE_LINUX=/s@"$@ net.ifnames=0"@' /etc/default/grub #centos 更新grub [root@centos8 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg #ubuntu 更新grub [root@ubuntu ~]# grub-mkconfig -o /boot/grub/grub.cfg

范例:查看配置文件

#过滤掉空行和#开头的行 sed -r '/^(#|$)/d' /etc/httpd/conf/httpd.conf sed -r '/^#|^$/d' /etc/httpd/conf/httpd.conf #可以排除行首后加多个空白符之后有#这种行 sed -n '/^$/d;/^[[:space:]]*#/!p' /etc/httpd/conf/httpd.conf sed -n -e '/^$/d' -e '/^[[:space:]]*#/!p' /etc/httpd/conf/httpd.conf #注意:以下前后顺序不同,执行效果不同 sed -n '/^[[:space:]]*#/!p;/^$/d' /etc/httpd/conf/httpd.conf sed -n -e '/^[[:space:]]*#/!p' -e '/^$/d' /etc/httpd/conf/httpd.conf

范例:引用变量

[root@centos8 ~]#echo|sed "s/^/$RANDOM.rmvb/" 5242.rmvb #单引号内的内容原样输出,不识别变量 [root@centos8 ~]#echo|sed 's/^/$RANDOM.rmvb/' $RANDOM.rmvb #单引号的特殊引用方式(仅供参考) [root@centos8 ~]#echo|sed 's/^/'$RANDOM'.rmvb/' 13849.rmvb [root@centos8 ~]#echo|sed 's/^/'''$RANDOM'''.rmvb/' 28767.rmvb

范例:修改http虚拟主机配置文件

[root@centos6 ~]#sed -e '/^#<VirtualHost/,/^#<\/VirtualHost>/s@#@@' -e '/^#NameVirtualHosts@#@@' /etc/httpd/conf/httpd.conf

范例:引用变量实现多点编辑

[root@centos8 ~]#port=8080 [root@centos8 ~]#sed -ri.bak -e 's/^Listen 80/Listen '$port'/' -e /ServerName/cServerName `hostname`:$port" /etc/httpd/conf/httpd.conf

范例:打印前十行

[root@centos7 ~]# seq 100 > test.txt [root@centos7 ~]# sed 10q test.txt 1 2 3 4 5 6 7 8 9 10

sed高级用法
sed 中除了模式空间,还另外还支持保持空间(Hold Space),利用此空间,可以将模式空间中的数据,临时保存至保持空间,从而后续接着处理,实现更为强大的功能。

常见高级选项:

P 打印模式空间开端至\n内容,并追加到默认输出之前 h 把模式空间中的内容覆盖至保持空间中 H 把模式空间中的内容追加至保持空间中 g 从保持空间取出数据覆盖至模式空间 G 从保持空间取出内容追加至模式空间 x 把模式空间中的内容与保持空间中的内容进行互换 n 读取匹配到的行的下一行覆盖至模式空间 N 读取匹配到的行的下一行追加至模式空间 d 删除模式空间中的行 D 如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环

范例:

sed -n 'n;p' FILE seq 10 | sed 'N;s/\n//' sed '1!G;h;$!d' FILE seq 10 | sed -n '/3/{g;1!p;};h' #前一行 seq 10 | sed -nr '/3/{n;p}' #后一行 sed 'N;D'FILE seq 10 |sed '3h;9G;9!d' sed '$!N;$!D' FILE sed '$!d' FILE sed 'G' FILE sed 'g' FILE sed '/^$/d;G' FILE sed 'n;d' FILE sed -n '1!G;h;$p' FILE

本文共计2453个文字,预计阅读时间需要10分钟。

如何使用sed进行文本处理操作?

Sed 是 Stream Editor 的缩写,与 vi 不同,sed 是行编辑器。官网:http://sed.sourceforge.net/

sed 从文件或管道中读取一行,处理该行,然后输出该行;再读取下一行,处理,输出,直至最后一行。每处理一行,称为处理一次。

如何使用sed进行文本处理操作?

sed 即 Stream EDitor,和 vi 不同,sed是行编辑器
官网:sed.sourceforge.net/

Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(PatternSpace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快
帮助参考网站: www.gnu.org/software/sed/manual/sed.html

sed基本用法
格式:

sed [option]... 'script;script;...' [inputfile...]

常用选项:

-n 不输出模式空间内容到屏幕,即不自动打印 -e 多点编辑 -f FILE 从指定文件中读取编辑脚本 -r, -E 使用扩展正则表达式 -i.bak 备份文件并原处编辑 -s 将多个文件视为独立文件,而不是单个连续的长文件流 #说明: -ir 不支持 -i -r 支持 -ri 支持 -ni 会清空文件

script格式:

'地址+命令'

地址格式:

1. 不给地址:对全文进行处理 2. 单地址: #:指定的行,$:最后一行 /pattern/:被此处模式所能够匹配到的每一行 3. 地址范围: #,# 从#行到第#行, 如3,6 从第3行到第6行 #,+# 从#行到+#行, 如3,+4 表示从3行到第7行 /pat1/,/pat2/ #,/pat/ /pat/,# 4. 步进:~ 1~2 奇数行 2~2 偶数行

命令:

p 打印当前模式空间内容,追加到默认输出之后 Ip 忽略大小写输出 d 删除模式空间匹配的行,并立即启用下一轮循环 a [\]text 在指定行后面追加文本,支持使用\n实现多行追加 i [\]text 在行前面插入文本 c [\]text 替换行为单行或多行文本 w file 保存模式匹配的行至指定文件 r file 读取指定文件的文本至模式空间中匹配到的行后 = 为模式空间中的行打印行号 ! 模式空间中匹配行取反处理 q 结束或退出sed

查找替换

s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s### 修饰符: g 行内全局替换 p 显示替换成功的行 w /PATH/FILE 将替换成功的行保存至文件中 I,i 忽略大小写

范例:

[root@centos7 ~]# sed -n '' /etc/redhat-release # -n 屏蔽默认输出 [root@centos7 ~]# sed '' /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [root@centos7 ~]# sed -n 'p' /etc/redhat-release # 'p' 打印行 CentOS Linux release 7.9.2009 (Core) [root@centos7 ~]# ifconfig eth0 | sed -n '2p' #打印第二行 inet 10.0.24.17 netmask 255.255.252.0 broadcast 10.0.27.255 [root@centos7 ~]# sed -n '$p' /etc/passwd #打印末行 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin #打印倒数第二行 [root@centos7 ~]# sed -n "$(echo $[`cat /etc/passwd | wc -l` -1])p" /etc/passwd wang:x:2006:2007::/home/wang:/bin/nologin #查看现有分区及挂载情况 [root@centos7 ~]# df | sed -n '/^\/dev\/sd/p' /dev/sda1 82437508 6128756 72853288 8% / #打印奇数行(从第一行开始,步长为2) [root@centos7 ~]# seq 10 | sed -n '1~2p' 1 3 5 7 9 #打印偶数行(从第二行开始,步长为2) [root@centos7 ~]# seq 10 | sed -n '2~2p' 2 4 6 8 10 #多点编辑删除第二行和第四行 [root@centos7 ~]# seq 5 | sed -e '2d' -e '4d' 1 3 5 [root@centos7 ~]# seq 5 | sed '2d;4d' 1 3 5 #安装httpd以获得配置文件httpd.conf [root@centos7 ~]# rpm -qi httpd || yum install -y httpd #删除配置文件中的空行和#开头的注释行: [root@centos7 ~]# sed '/^#/d;/^$/d' /etc/httpd/conf/httpd.conf [root@centos7 ~]# grep -Ev '^#|^$' /etc/httpd/conf/httpd.conf #修改网卡命名规则为eth0,eth1的形式 [root@centos7 ~]# sed -Ei.bak '/^GRUB_CMDLINE_LINUX/s/(.*)(")$/\1net.ifnames=0\2/' /etc/default/grub

搜索替换和&

#后向引用 [root@centos7 ~]# sed -nr 's/r..t/&@@/gp' /etc/passwd # &等于/r..t/的匹配结果 root@@:x:0:0:root@@:/root@@:/bin/bash operator:x:11:0:operator:/root@@:/sbin/nologin ftp:x:14:50:FTP User:/var/ft@@p:/sbin/nologin

范例:获取分区利用率

[root@centos7 ~]# df | sed -En '/^\/dev\/sd/s@.* ([0-9]+)%.*@\1@p' [root@centos8 ~]#df | sed -nr '/^\/dev\/sd/s# .* ([0-9]+)%.*# \1#p' /dev/sda2 3 /dev/sda5 1 /dev/sda1 14 [root@centos8 ~]#df | sed -rn '/^\/dev\/sd/ s#([^[:space:]]+[[:space:]]+){4}(.*)%.*#\2#p' 3 1 19 [root@centos8 ~]#df | sed -rn '/^\/dev\/sd/ s#(\S+\s+){4}(.*)%.*#\2#p' 3 1 19

范例:取IP地址

[root@centos7 ~]# ifconfig eth0 | sed -nr "2s/[^0-9]+([0-9.]+).*/\1/p" 10.0.0.8 [root@centos7 ~]# ifconfig eth0 | sed -rn '2s/^[^0-9]+([0-9.]+) .*$/\1/p' 10.0.0.8 [root@centos7 ~]# ifconfig eth0 | sed -rne '2s/^.*inet //' -e 's/netmask.*//p' 10.0.0.8 [root@centos7 ~]# ifconfig eth0 | sed -n '2s/^.*inet //;s/ netmask.*//p' 10.0.0.8 [root@centos7 ~]# ifconfig eth0 | sed -rn '2s/(.*inet )([0-9].*)(netmask.*)/\2/p' 10.0.0.8

范例:取路径中的基名和目录名

#取目录名 [root@centos7 ~]# echo /etc/sysconfig/network | sed -rn 's#(.*)/([^/]+)/?#\1#p' /etc/sysconfig #取基名 [root@centos7 ~]# echo /etc/sysconfig/network | sed -rn 's#(.*)/([^/]+)/?#\2#p' network

范例:取文件的前缀和后缀

[root@centos7 ~]# echo a.b.c.gz|sed -En 's/(.*)\.(.*)$/\1/p' a.b.c [root@centos7 ~]# echo a.b.c.gz|sed -En 's/(.*)\.(.*)$/\2/p' gz [root@centos7 ~]# echo a.b.c.gz|sed -En 's/(.*)\.([^.]+)$/\1/p' a.b.c [root@centos7 ~]# echo a.b.c.gz|sed -En 's/(.*)\.([^.]+)$/\2/p' gz [root@centos7 ~]# echo a.b.c.gz | grep -Eo '[^.]+$' gz

范例:将非#开头行注释

[root@centos8 ~]# sed -rn "s/^[^#]/#&/p" /etc/fstab [root@centos8 ~]# sed -rn 's/^[^#](.*)/#\1/p' /etc/fstab [root@centos8 ~]# sed -rn '/^#/!s@^@#@p' /etc/fstab

范例:修改内核参数

[root@centos7 ~]# sed -nr '/^GRUB_CMDLINE_LINUX/s/"$/ net.ifnames=0"/p' /etc/default/grub GRUB_CMDLINE_LINUX="crashkernel=auto console=ttyS0 console=tty0 panic=5 net.ifnames=0 biosdevname=0 intel_idle.max_cstate=1 intel_pstate=disablenet.ifnames=0 net.ifnames=0" [root@centos7 ~]# sed -rn '/^GRUB_CMDLINE_LINUX=/s@(.*)"$@\1 net.ifnames=0"@p' /etc/default/grub GRUB_CMDLINE_LINUX="crashkernel=auto console=ttyS0 console=tty0 panic=5 net.ifnames=0 biosdevname=0 intel_idle.max_cstate=1 intel_pstate=disablenet.ifnames=0 net.ifnames=0" [root@centos7 ~]# sed -rn '/^GRUB_CMDLINE_LINUX=/s@"$@ net.ifnames=0"@p' /etc/default/grub GRUB_CMDLINE_LINUX="crashkernel=auto console=ttyS0 console=tty0 panic=5 net.ifnames=0 biosdevname=0 intel_idle.max_cstate=1 intel_pstate=disablenet.ifnames=0 net.ifnames=0"

范例:修改网卡名称

#centos7、8 [root@centos8 ~]# sed -i '/GRUB_CMDLINE_LINUX=/s#quiet#& net.ifnames=0#' /etc/default/grub [root@centos8 ~]# sed -ri '/^GRUB_CMDLINE_LINUX=/s@"$@ net.ifnames=0"@' /etc/default/grub #centos 更新grub [root@centos8 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg #ubuntu 更新grub [root@ubuntu ~]# grub-mkconfig -o /boot/grub/grub.cfg

范例:查看配置文件

#过滤掉空行和#开头的行 sed -r '/^(#|$)/d' /etc/httpd/conf/httpd.conf sed -r '/^#|^$/d' /etc/httpd/conf/httpd.conf #可以排除行首后加多个空白符之后有#这种行 sed -n '/^$/d;/^[[:space:]]*#/!p' /etc/httpd/conf/httpd.conf sed -n -e '/^$/d' -e '/^[[:space:]]*#/!p' /etc/httpd/conf/httpd.conf #注意:以下前后顺序不同,执行效果不同 sed -n '/^[[:space:]]*#/!p;/^$/d' /etc/httpd/conf/httpd.conf sed -n -e '/^[[:space:]]*#/!p' -e '/^$/d' /etc/httpd/conf/httpd.conf

范例:引用变量

[root@centos8 ~]#echo|sed "s/^/$RANDOM.rmvb/" 5242.rmvb #单引号内的内容原样输出,不识别变量 [root@centos8 ~]#echo|sed 's/^/$RANDOM.rmvb/' $RANDOM.rmvb #单引号的特殊引用方式(仅供参考) [root@centos8 ~]#echo|sed 's/^/'$RANDOM'.rmvb/' 13849.rmvb [root@centos8 ~]#echo|sed 's/^/'''$RANDOM'''.rmvb/' 28767.rmvb

范例:修改http虚拟主机配置文件

[root@centos6 ~]#sed -e '/^#<VirtualHost/,/^#<\/VirtualHost>/s@#@@' -e '/^#NameVirtualHosts@#@@' /etc/httpd/conf/httpd.conf

范例:引用变量实现多点编辑

[root@centos8 ~]#port=8080 [root@centos8 ~]#sed -ri.bak -e 's/^Listen 80/Listen '$port'/' -e /ServerName/cServerName `hostname`:$port" /etc/httpd/conf/httpd.conf

范例:打印前十行

[root@centos7 ~]# seq 100 > test.txt [root@centos7 ~]# sed 10q test.txt 1 2 3 4 5 6 7 8 9 10

sed高级用法
sed 中除了模式空间,还另外还支持保持空间(Hold Space),利用此空间,可以将模式空间中的数据,临时保存至保持空间,从而后续接着处理,实现更为强大的功能。

常见高级选项:

P 打印模式空间开端至\n内容,并追加到默认输出之前 h 把模式空间中的内容覆盖至保持空间中 H 把模式空间中的内容追加至保持空间中 g 从保持空间取出数据覆盖至模式空间 G 从保持空间取出内容追加至模式空间 x 把模式空间中的内容与保持空间中的内容进行互换 n 读取匹配到的行的下一行覆盖至模式空间 N 读取匹配到的行的下一行追加至模式空间 d 删除模式空间中的行 D 如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环

范例:

sed -n 'n;p' FILE seq 10 | sed 'N;s/\n//' sed '1!G;h;$!d' FILE seq 10 | sed -n '/3/{g;1!p;};h' #前一行 seq 10 | sed -nr '/3/{n;p}' #后一行 sed 'N;D'FILE seq 10 |sed '3h;9G;9!d' sed '$!N;$!D' FILE sed '$!d' FILE sed 'G' FILE sed 'g' FILE sed '/^$/d;G' FILE sed 'n;d' FILE sed -n '1!G;h;$p' FILE