我想用sed替换IP地址上的第二个八位字节:
例:
10.110.30.11
10.133.30.11
执行此任务的最简单方法是什么?
谢谢
使用GNU sed:
sed 's/\.[0-9]\+\./.133./' file
纯粹bash
的尝试,除了精彩的awk
和sed
从上面回答。
$ 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
awk 'BEGIN{FS=OFS="."}{$2=133}1' <<< "10.110.30.11"
10.133.30.11
这会将第二个八位字节的值更改为133.列由在BEGIN块内定义的文字点分隔。
如果您的输入是基于列的,我认为awk可以更容易一些。
awk -F'.' -v OFS="." '$2=133'
用你的例子:
$ echo "10.110.30.11" | awk -F'.' -v OFS="." '$2=133'
10.133.30.11
做:
sed -E 's/^([^.]+\.)[^.]+(\.[^.]+\.[^.]+$)/\1133\2/'
请注意,匹配IP地址需要在Regex中进行一些工作,或许您应该为您选择的语言寻找特定的库。对于手头的任务,这应该做。
例:
% sed -E 's/^([^.]+\.)[^.]+(\.[^.]+\.[^.]+$)/\1133\2/' <<<'10.110.30.11'
10.133.30.11
使用awk和sub
:
$ awk 'sub(/\.[0-9]{1,3}\./,".133.")' <(echo 10.110.30.11)
10.133.30.11
这可能适合你(GNU sed):
sed 's/[0-9]\+/133/2' file
替换第二个出现的一个或多个数字字符。