有没有人知道用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即时开放以获取这些建议!!
谢谢!
答案 0 :(得分: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地址的相关部分,但你应该真的,真实地显示输入数据的样子。
答案 1 :(得分:2)
我更希望使用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
唯一解决方案,无需cut
(建议Jonathan Leffler)
awk -F'.' '{printf "%d%03d\n", $3 % 10, $4}' /metadata > /metaport
答案 2 :(得分: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
答案 3 :(得分:0)
鉴于描述 - 当我们只有2个数字进入端口时,只插入两个零,以下应该有效:
sed -r '/Port [0123456789]{2}$/s/Port (.)/\100/'
所以这仅在Port跟随2位数时匹配。如果匹配,则用该数字和两个零替换第一个数字。
如果你需要处理3个数字,可以轻易地添加另一个只有3位数的匹配部分。