Linux文本操作(2)sed

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

删除第二到四行

1
sed '2,4d' 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/'
作者

HXD

发布于

2024-03-11

更新于

2024-12-11

许可协议

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

评论

You need to set client_id and slot_id to show this AD unit. Please set it in _config.yml.