更改 IP awk 中的最后一个八位字节

更改 IP awk 中的最后一个八位字节

假设有以下文件

Somestring 1.2.3.4 more charachters and strings
Somestring 1.2.3.5 more charachters and strings
Somestring 1.2.3.6 more charachters and strings

我想更改 IP 中的最后一个八位字节:

Somestring 1.2.3.x more charachters and strings
Somestring 1.2.3.x more charachters and strings
Somestring 1.2.3.x more charachters and strings

我怎样才能在 awk 或 sed 中实现这一点?

我所做的是:

awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH-1); print ip }' file  

但这只打印ip并且不完全正确。

此外我尝试过:

awk '{split($2,ip,".") gsub(ip[2],"x"); print}' 

但这也是不正确的,因为它也替换了第一个八位字节。

Somestring x.2.3.x more charachters and strings
Somestring x.2.3.x more charachters and strings
Somestring x.2.3.x more charachters and strings

感谢帮助

答案1

用于sed此目的:

$ sed -E 's/ (([0-9]{1,3}\.){3})[0-9]{1,3} / \1x /' file
Somestring 1.2.3.x more charachters and strings
Somestring 1.2.3.x more charachters and strings
Somestring 1.2.3.x more charachters and strings

这会查找一个空格后跟三组[0-9]{1,3}\.(一到三位数字后跟一个点),并将其捕获到\1.然后我们还替换最后一组[0-9]{1,3}和最后一个空格。这全部被替换为␣\1x␣where\1是第一组三个数字和点。

答案2

如果你真的想在中做到这一点awk,那么你需要锚定表达式 - 而且你只需要sub它,gsub因为它是一个单一的替换,例如

awk '{sub(/\.[0-9][0-9]?[0-9]?$/,".x",$2)} 1' input
Somestring 1.2.3.x more charachters and strings
Somestring 1.2.3.x more charachters and strings
Somestring 1.2.3.x more charachters and strings

一些您可以使用 ERE[0-9]{1,3}来实现数字重复。

答案3

awk '{sub(/.$/,"x",$2)}1' file

Somestring 1.2.3.x more charachters and strings
Somestring 1.2.3.x more charachters and strings
Somestring 1.2.3.x more charachters and strings

相关内容