文本处理三剑客之 sed

1、sed 工作原理

sed 即 Stream EDitor,和 vi 不同,sed是行编辑器。

图片[1]-文本处理三剑客之 sed-李佳程的个人主页

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

2、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@centos79_test test]# sed '' /etc/issue
\S
Kernel \r on an \m
[root@centos79_test test]# sed 'p' /etc/issue
\S
\S
Kernel \r on an \m
Kernel \r on an \m
[root@centos79_test test]# sed 'p' /etc/issue -n
\S
Kernel \r on an \m
[root@centos79_test test]# sed '2p' /etc/issue
\S
Kernel \r on an \m
Kernel \r on an \m
[root@centos79_test test]# sed '1p' /etc/issue
\S
\S
Kernel \r on an \m

[root@centos79_test test]# ifconfig eth0 | sed '2p'
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.10  netmask 255.255.255.0  broadcast 192.168.1.255
        inet 192.168.1.10  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::20c:29ff:fe5c:40aa  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:5c:40:aa  txqueuelen 1000  (Ethernet)
        RX packets 3790  bytes 308530 (301.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2776  bytes 301580 (294.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
#范例
#修改selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

#不显示注释行和空行
sed '/^#/d;/^$/d' /etc/fstab
sed  -r  '/^(#|$)/d' fstab
sed  -r  '/^#|^$/d' fstab

#将#开头的行删除#
sed -ri.bak '/^#/s/^#//' fstab

#可以排除行首后加多个空白符之后有#这种行
sed  -n '/^$/d;/^[[:space:]]*#/!p' fstab
sed  -n  -e '/^$/d' -e '/^[[:space:]]*#/!p' fstab

#多点编辑
[root@centos79_test test]# sed -n -e 's/Created/create111/p' -e 's/swap/swap111/p' fstab
 # create111 by anaconda on Tue Nov  8 14:51:00 2022
 /dev/mapper/centos-swap111 swap                    swap    defaults        0 0

3、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
#范例
#打印偶数行
[root@centos79_test test]# seq 10
1
2
3
4
5
6
7
8
9
10
[root@centos79_test test]# seq 10 | sed -n 'n;p'
2
4
6
8
10

seq 10 | sed -n '2~2p'
seq 10 | sed '1~2d'
seq 10 | sed -n '1~2!p'

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享