在每行开头添加少于 4 个符号的缺失零

在每行开头添加少于 4 个符号的缺失零

我想问你如何解决这个问题:我需要在单词少于 4 个字母的每一行前面添加 0。

输入文件示例:

30
1
508
A0EA
A0EB
A0EC
A0ED

期望的输出应该是:

0030
0001
0508
A0EA
A0EB
A0EC
A0ED

非常感谢您的支持。

答案1

您可以向所有行添加 4 个前导零,然后获取每行的最后 4 个字符:

sed 's/^/0000/; s/^.*\(.\{4\}\)/\1/' < file

或者首先避免截断宽度超过 4 位的数字:

sed 's/^/0000/; s/^.\{1,4\}\(.\{4\}\)/\1/' < file

答案2

还有一个混合:

$ numfmt --format='%04.0f' --invalid=ignore < file
0030
0001
0508
A0EA
A0EB
A0EC
A0ED

numfmt由 GNU Coreutils 包提供。

答案3

如果您的输入是十六进制数字,则使用 GNU awk for strtonum():

$ awk '{printf "%04X\n", strtonum("0x"$0)}' file
0030
0001
0508
A0EA
A0EB
A0EC
A0ED

使用 GNU awk 无论您的输入是否为十六进制:

$ awk '{print gensub(/ /,0,"g",sprintf("%4s",$0))}' file
0030
0001
0508
A0EA
A0EB
A0EC
A0ED

对于任何 awk,无论您的输入是否为十六进制:

$ awk '{v=sprintf("%4s",$0); gsub(/ /,0,v); print v}' file
0030
0001
0508
A0EA
A0EB
A0EC

甚至:

$ awk '{$0=sprintf("%4s",$0); gsub(/ /,0)} 1' file
0030
0001
0508
A0EA
A0EB
A0EC
A0ED

答案4

对于zshshell,您可以使用l:length::string:left-padding 参数扩展标志。

$ var=FF
$ echo ${(l:4::0:)var}
00FF

要将其应用于文件中的每个单词:

printf '%s\n' ${(l:4::0:)$(<file)}

请注意,该运算符还截断超过 4 个字符的单词。

相关内容