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

时间:2016-10-19 08:03:00

标签: bash awk sed

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

示例:

  

10的 110 .30.11

     

10的 133 .30.11

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

谢谢

7 个答案:

答案 0 :(得分: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 :(得分:1)

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

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

以你的例子:

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

使用GNU sed:

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

答案 4 :(得分:0)

执行:

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

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

示例:

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

答案 5 :(得分:0)

使用awk和sub

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

答案 6 :(得分:0)

这可能适合你(GNU sed):

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

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