1

有谁知道用0替换空格的方法?这就是我想要做的事情......基本上我有一个脚本可以提取一个IP地址并操纵该地址以从中制作一个端口号。

192.168.202.3 = Port 23

我需要的是一个足够聪明的 sed 命令,在 3 之前添加 2 个 0,使其成为一个完整的值。

192.168.202.3 = Port 2003

或者:

192.168.202.003 = Port 2003

问题是,如果数字已经存在,那么我不希望它添加 0。

192.168.202.254 = Port 2254

代替:

192.168.202.254 = Port 200254

关于如何做的任何想法?

脚本的相关部分:

# Retrieve local-ipv4 address from meta-data
GET http://169.254.169.254/latest/meta-data/local-ipv4 > /metadata

# Create a manipulated version of ipv4 to use as a port number
sed "s/192.168.20//" /metadata > /metaport
sed -i "s/\.//g" /metaport

如果您有另一种不使用 sed 的方法,我也可以为这些建议打开!!

谢谢!

4

4 回答 4

3

我更喜欢使用awk数字操作而不是sed

awk -F'.' '{printf "%03s%03s\n", $3, $4}' /metadata | cut -c3-6 > /metaport

输入IP:

192.168.202.3
192.168.202.23
192.168.202.254

输出端口:

2003
3023
2254

编辑

更简洁awk的唯一解决方案,避免需要cutJonathan Leffler建议)

awk -F'.' '{printf "%d%03d\n", $3 % 10, $4}' /metadata > /metaport
于 2013-10-03T15:09:41.033 回答
2

如果输入文件只包含一个 IP 地址,那么蛮力和无知可以完成这项工作:

sed -e 's/\([0-9]\)\.\([0-9]\)$/& = Port \100\2/' \
    -e 's/\([0-9]\)\.\([0-9][0-9]\)$/& = Port \10\2/' \
    -e 's/\([0-9]\)\.\([0-9][0-9][0-9]\)$/& = Port \1\2/'

第一个表达式处理 1 个数字;第二个有 2 位数字;第三个是 3。

给定输入数据:

192.168.202.3
192.168.203.13
192.168.202.003
192.168.202.254

输出是:

192.168.202.3 = Port 2003
192.168.203.13 = Port 3013
192.168.202.003 = Port 2003
192.168.202.254 = Port 2254

如果您有不同的输入数据格式,您必须更加努力地隔离 IP 地址的相关部分,但您应该真正、真正地展示输入数据的样子。

于 2013-10-03T14:50:15.417 回答
1

只是为了好玩,bash:

while IFS=. read a b c d; do
    printf "%d%03d\n" $((c%10)) $d
done <<END
192.168.202.3
192.168.202.003
192.168.209.123
127.0.0.1
END
2003
2003
9123
0001
于 2013-10-03T16:26:54.217 回答
0

鉴于描述 - 只有当我们只有 2 位数字进入端口时才插入两个零,以下应该可以工作:

sed -r '/Port [0123456789]{2}$/s/Port (.)/\100/'

所以这仅在端口后跟 2 位数字时匹配。如果匹配,则用该数字和两个零替换第一个数字。

如果您需要处理 3 位数字,则可以轻松添加另一个仅执行 3 位数字的匹配部分。

于 2013-10-03T14:49:19.303 回答