有没有一种方法可以格式化bash / sh脚本中字符串中子字符串的宽度?

时间:2019-07-19 17:52:46

标签: bash shell

我必须使用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

我该怎么做?

4 个答案:

答案 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")