sed(Stream Editor)是一个强大的文本处理工具,广泛用于在流(如文件或标准输入)中进行查找、替换、插入、删除等操作
sed 用法
sed 是一种流编辑器,用于逐行处理文本文件,可以进行文本替换、删除、插入等操作。
1 2 3 4 5 6 7 8 9 10 11 12
| #总体命令结构 sed [-hnV][-e<script>][-f<script文件>][文本文件] | | |_________-f 可以指定需要对文件执行的sed脚本 | |________________________-e 指定对文本进行动作:| a: Append 在指定行的下一行添加内容 | | c: 替代指定行为指定的内容 | | d: Delete 删除指定行 | | i: Insert 在指定行的上一行添加内容 | | p: Print 打印,将指定内容打印出 | | s: Substitute 通过正则表达式替换指定内容 |___________________________________ |-n或--quiet或--silent 仅显示script处理后的结果。 |-i 是就地修改原文件,慎用
|
例子:
在第二行下一行添加’newline’
1
| sed '2a newline' filename
|
在第二行下添加多行,每行之间用\n隔开
1
| sed '2a line1\nline2' filename
|
在第四行上一行添加’hello world’
1
| sed '4i hello world' filename
|
删除第二到四行
将第三行替换为’Ni Hao’
1
| sed '3c Ni Hao' filename
|
将文本内’hello’替换为’Ni Hao’
1
| sed 's/hello/Ni Hao/g' filename
|
提取id addr输出的IP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| #原始信息 hxd@lb:~$ ip addr show enp1s0 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:87:81:bb brd ff:ff:ff:ff:ff:ff inet 192.168.50.126/24 metric 100 brd 192.168.50.255 scope global dynamic enp1s0 valid_lft 81319sec preferred_lft 81319sec inet 192.168.50.201/32 scope global enp1s0 valid_lft forever preferred_lft forever inet6 fe80::5054:ff:fe87:81bb/64 scope link valid_lft forever preferred_lft forever # 我们只需要IP,需要删除IP前面 空格和inet 和 IP后面的部分 #首先筛选出ip所在的行 hxd@lb:~$ ip addr show enp1s0 | grep inet inet 192.168.50.126/24 metric 100 brd 192.168.50.255 scope global dynamic enp1s0 inet 192.168.50.201/32 scope global enp1s0 inet6 fe80::5054:ff:fe87:81bb/64 scope link #匹配多个空格加inet和空格将其替换为空 hxd@lb:~$ ip addr show enp1s0 | grep inet | sed 's#^[ ]*inet\(6\)\?[ ]*##' 192.168.50.126/24 metric 100 brd 192.168.50.255 scope global dynamic enp1s0 192.168.50.201/32 scope global enp1s0 fe80::5054:ff:fe87:81bb/64 scope link #匹配IP后/之后的内容替换为空,就得到了ip hxd@lb:~$ ip addr show enp1s0 | grep inet | sed 's#^[ ]*inet\(6\)\?[ ]*##' | sed 's#/\([1-9]\{2\}\).*##' 192.168.50.126 192.168.50.201 fe80::5054:ff:fe87:81bb
# 命令解读 ip addr show enp1s0 | grep inet | sed 's#^[ ]*inet\(6\)\?[ ]*##' | sed 's#/\([1-9]\{2\}\).*## ^ 匹配行首 [ ]* 多次匹配空格 inet\(6\)\? 匹配inet和inet6 ?代表匹配0次或多次 # 分隔符 /\([1-9]\{2\}\) 匹配/和两位数字 .* 匹配后面的所有字符 # 高级写法使用捕获组替换匹配内容 ip addr show enp1s0 | grep inet | sed 's#^[ ]*inet[6]\?[ ]*\([0-9\.]*\|[0-9a-fA-F:]*\)\/[0-9]\{2\}.*$#\1#' ([0-9\.]*\|[0-9a-fA-F:]*\) 作为捕获组匹配ipv4和ipv6 将匹配到的整行用捕获组内容替换 ()代表表达式分组 \1代表第一个捕获组
|
sed 使用扩展语法可以省去很多转义符号,可读性更强,需要加-E参数
1
| ip addr show enp1s0 | grep inet | sed -E 's/^[ ]*inet[6]?[ ]*([0-9\.]+|[0-9a-fA-F:]+)\/[0-9]{2}.*$/\1/'
|