使用sed用0(零)填充空白

时间:2013-10-03 14:27:04

标签: linux sed

有没有人知道用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 个答案:

答案 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位数的匹配部分。