我必须使用bash脚本格式化字符串中子字符串的宽度,但不能使用标记或循环。为了与每个字段的标准宽度2匹配,两个冒号之间的单个字符应以0开头。
例如
来自:
6:0:36:35:30:30:72:6c:73:0:c:52:4c:30:31:30:31:30:30:30:31:36:39:0:1:3
到
06:00:36:35:30:30:72:6c:73:00:0c:52:4c:30:31:30:31:30:30:30:31:36:39:00:01:03
我该怎么做?
答案 0 :(得分:2)
sed -r 's/\<([0-9a-f])\>/0\1/g'
搜索并用正则表达式替换。使用\<
和\>
来匹配单词边界,因此[0-9a-f]
仅匹配一位数字。
$ sed -r 's/\<([0-9a-f])\>/0\1/g' <<< "6:0:36:35:30:30:72:6c:73:0:c:52:4c:30:31:30:31:30:30:30:31:36:39:0:1:3"
06:00:36:35:30:30:72:6c:73:00:0c:52:4c:30:31:30:31:30:30:30:31:36:39:00:01:03
答案 1 :(得分:0)
awk -F: -v OFS=: '{for(i=1;i<=NF;i++) if(length($i)==1)gsub($i,"0&",$i)}1' file
输出:
06:00:36:35:30:30:72:6c:73:00:0c:52:4c:30:31:30:31:30:30:30:31:36:39:00:01:03
这会将整行分成:
分隔的字段,如果任何字段的长度为==
1,则它将用0
字段替换该字段。
答案 2 :(得分:0)
重击解决方案:
IFS=:; for i in $string; do echo -n 0$i: | tail -c 3; done
答案 3 :(得分:0)
使用
str="06:00:36:35:30:30:72:6c:73:00:0c:52:4c:30:31:30:31:30:30:30:31:36:39:00:01:03"
您可以为所有令牌添加“ 0”,并删除不需要的令牌:
sed -r 's/0([0-9a-f]{2})/\1/g' <<< "0${str//:/:0}"
感觉不对,会出错并进行修复。
更好的选择是
echo $(IFS=:; printf "%2s:" ${str} | tr " " "0")