sed - 替换IP地址上的第二个八位字节

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

我想用sed替换IP地址上的第二个八位字节:

例:

10.110.30.11

10.133.30.11

执行此任务的最简单方法是什么?

谢谢

bash awk sed
7个回答
0
投票

使用GNU sed:

sed 's/\.[0-9]\+\./.133./' file

2
投票

纯粹bash的尝试,除了精彩的awksed从上面回答。

 $ IFS="." read -r octet1 _ octet3 octet4 <<<"10.110.30.11"
 $ octet2=133
 $ printf "%s.%s.%s.%s\n" "$octet1" "$octet2" "$octet3" "$octet4"
 10.133.30.11

1
投票
awk  'BEGIN{FS=OFS="."}{$2=133}1' <<< "10.110.30.11"
10.133.30.11

这会将第二个八位字节的值更改为133.列由在BEGIN块内定义的文字点分隔。


1
投票

如果您的输入是基于列的,我认为awk可以更容易一些。

awk -F'.' -v OFS="." '$2=133'

用你的例子:

$ echo "10.110.30.11" | awk -F'.' -v OFS="." '$2=133'
10.133.30.11

0
投票

做:

sed -E 's/^([^.]+\.)[^.]+(\.[^.]+\.[^.]+$)/\1133\2/'

请注意,匹配IP地址需要在Regex中进行一些工作,或许您应该为您选择的语言寻找特定的库。对于手头的任务,这应该做。

例:

% sed -E 's/^([^.]+\.)[^.]+(\.[^.]+\.[^.]+$)/\1133\2/' <<<'10.110.30.11' 
10.133.30.11

0
投票

使用awk和sub

$ awk 'sub(/\.[0-9]{1,3}\./,".133.")' <(echo 10.110.30.11)
10.133.30.11

0
投票

这可能适合你(GNU sed):

sed 's/[0-9]\+/133/2' file

替换第二个出现的一个或多个数字字符。

© www.soinside.com 2019 - 2024. All rights reserved.