假设有以下文件
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