sed命令中的问题

问题描述 投票:0回答:1

我正在尝试更改以下字符串中的nw_src

cookie=0xb868a1f26498cddd, duration=5327.613s, table=0, n_packets=199, n_bytes=19502, priority=30,icmp,in_port="qvo2495b490-33",nw_src=10.0.0.133,nw_dst=8.8.8.0/24 actions=group:2

使用的命令:

sed -i -e
's/nw_src=(^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$,)/nw_src=1.1.1.1/g' flows.txt

然而,当我从正则表达式生成数据时,它似乎不起作用:它正确显示了所生成数据的所有排列。

I am just trying to replace nw_src=<any_ipv4_address> to nw_src=1.1.1.1 

也nw_src仅在行中出现一次

我想念的是什么。请帮助

linux sed
1个回答
0
投票

让我们从正则表达式开始,该正则表达式验证文本片段是一个,两位或三位数字的子字符串,代表一个介于0到255之间的数值:

2(5[0-5]|[0-4][0-9])|1[0-9]{2}|[1-9]?[0-9]

例如,运行以下命令并检查其输出:

seq 0 999 | grep -E '^(2(5[0-5]|[0-4][0-9])|1[0-9]{2}|[1-9]?[0-9])$'

seq生成从0到999的所有整数,每行一个,并且grep将仅返回从0到255的整数。请注意,我必须将正则表达式括在括号中,以便锚点^和[C0 ]适用于整个事物。通常,您需要在正则表达式前加上非数字或某种零长​​度断言,以确保该字符串不是较长数字序列的子字符串。

如果必须替换$的值,但仅当它是有效的IP4地址(并且如果它不是有效的IP4地址,则将其保留不变)时,可以执行此操作:

nw_src

如果可以确保“旧”值始终是有效的IP4地址(因此您无需在此命令中进行验证),如果您需要替换“旧”值,无论无论它是否是有效地址,都可以将命令简化很多;例如

sed -iE 's/\bnw_src=(2(5[0-5]|[0-4][0-9])|1[0-9]{2}|[1-9]?[0-9])(\.\1){3}\b/nw_src=1.1.1.1/' 
© www.soinside.com 2019 - 2024. All rights reserved.