如何在bash中填充用点分隔的整数序列

时间:2018-03-15 10:00:32

标签: regex bash

我需要以特定格式塑造版本。

例如:

V1=1.0.1
V2=4.0.1
V3=3.1.101
...

需要填0,如下所示:

V1=001.000.001.000
V2=004.000.001.000
V3=003.001.101.000
...

关于我如何做到这一点的任何想法?

编辑:

我成功使用printf如下:

printf "%03d.%03d.%03d.000\n" $(echo $V3 | grep -o '[^-]*$' | cut -d. -f1) $(echo $V3 | grep -o '[^-]*$' | cut -d. -f2) $(echo $V3 | grep -o '[^-]*$' | cut -d. -f3)

输出:

003.001.101.000

有更好的建议吗?

3 个答案:

答案 0 :(得分:1)

您可以尝试awk

awk -F'[=.]' '{                        # Set field delimiter to = and .
   split($0, a, FS, seps)              # Get all elements and separator into an array
   for(i=1;i<=5;i++) {                # Loop though all fields
     if(i>1) 
       a[i]=sprintf("%03d",$i)         # Update the version number with 3 digits
     printf "%s%s", a[i], seps[i]}     # Print the field
     print ""                          # print a newline
}' file

如果版本采用bash变量,则可以使用更简单的awk单行:

V3="3.1.101"; awk -F. '{for(i=1;i<5;i++){$i=sprintf("%03d",$i)}}1' OFS='.' <<<$V3

答案 1 :(得分:1)

让我们尝试sed获取一个文本文件,列出版本作为输入,命名为versions.txt。为简单起见,我将指示分开:

# Add '00' before each sub-version number
sed -i -r 's/([=\.])([0-9])/\100\2/g' versions.txt
# Remove '00' if sub-version number had 3 digits
sed -i -r 's/([=\.])00([0-9]{3})/\1\2/g' versions.txt
# Remove '0' if sub-version number had 2 digits
sed -i -r 's/([=\.])00([0-9]{2})/\10\2/g' versions.txt
# Add the final '.000' after each version
sed -i -r 's/([0-9]{3}\.[0-9]{3}\.[0-9]{3})/\1\.000/g' versions.txt

答案 2 :(得分:1)

另一种sed方法:

sed -r 's/\b([0-9]{1})(\.|$)/00\1\2/g;s/\b([0-9]{2})(\.|$)/0\1\2/g;s/(([0-9]{3}\.|$){3})/\1.000/g'