如何使用bash使用前导零填充文件名

时间:2013-07-17 21:01:30

标签: bash scripting sed awk

我正在编写一个bash脚本,它从电子表格生成文件名,然后将现有文件转换为新文件。我已经能够使用生成的文件名62_02.png进行转换。如您所见,它包含整数,下划线和文件扩展名(可能是字母数字)。

我喜欢简洁this answer是多么简洁,我看到this post使用awk对纯数字文件名进行简单转换,但我不知道如何才能获得它使用下划线。

如果有必要,我也可以使用sed,如果这看起来很实用的话。

我的目标是拥有一个如下所示的文件名:

0062_02.png

非常感谢!

结束信息:

我选择了下面的解决方案,因为它有更多的解决方案,以便其他人可以选择阅读此内容。但是,我想提一下@cabad提供的答案也是有效的,对于新手程序员,恕我直言,这可能是更友好的解决方案。

3 个答案:

答案 0 :(得分:4)

尝试在中执行此操作:

使用

$ a=62_02.png
$ printf -v newvar %04d_%s ${a%_*} ${a##*_}
echo "$newvar"
0062_02.png

另一个简洁的解决方案:

$ ( a=62_02.png; IFS=_; printf '%04d_%s\n' $a )
0062_02.png

答案 1 :(得分:4)

根据要求使用awk:

echo "62_02.png" | awk -F_ '{ printf("%04d_%s\n", $1, $2); }'

“-F_”告诉awk使用下划线作为字段分隔符。这个答案假定您的文件名只有一个下划线。

编辑:如果你的文件名可以有多个下划线,那么你可以这样做:

echo "62_02.png" | awk -F_ '{ printf("%04d_%s\n", $1, substr($0, index($0, $2))); }'
echo "62_02_x.png" | awk -F_ '{ printf("%04d_%s\n", $1, substr($0, index($0, $2))); }'

答案 2 :(得分:2)

GNU代码

sed -r ':k;s/\b[0-9]{1,3}_/0&/g;tk'

示例:

$ echo 6_02.png| sed -r ':k;s/\b[0-9]{1,3}_/0&/g;tk'
0006_02.png

$ echo 62_02.png| sed -r ':k;s/\b[0-9]{1,3}_/0&/g;tk'
0062_02.png

$ echo 162_02.png| sed -r ':k;s/\b[0-9]{1,3}_/0&/g;tk'
0162_02.png

$ echo 1632_02.png| sed -r ':k;s/\b[0-9]{1,3}_/0&/g;tk'
1632_02.png

$ echo 16324_02.png| sed -r ':k;s/\b[0-9]{1,3}_/0&/g;tk'
16324_02.png