sed命令中的问题

时间:2020-05-12 06:00:45

标签: linux sed

我正在尝试更改以下字符串中的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也仅出现一次

我想念的是什么。 请帮忙

2 个答案:

答案 0 :(得分: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的整数。请注意,我必须将正则表达式放在括号中,以便锚点{{1 }}和^适用于整个内容。通常,您需要在正则表达式前加上非数字或某种零长​​度断言,以确保该字符串不是较长数字序列的子字符串。

如果必须替换$的值,但仅当它是有效的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/' 

答案 1 :(得分:0)

如果您只想做replace nw_src=<any_ipv4_address> to nw_src=1.1.1.1,那么下面的内容就足够了

sed 's/\(.*nw_src=\)\([^,]*\),\(.*\)/\11.1.1.1,\2/' network_file 

输出

$ sed 's/\(.*nw_src=\)\([^,]*\),\(.*\)/\11.1.1.1,\2/' network_file 
cookie=0xb868a1f26498cddd, duration=5327.613s, table=0, n_packets=199, n_bytes=19502, priority=30,icmp,in_port="qvo2495b490-33",nw_src=1.1.1.1,10.0.0.133
相关问题