![在每行开头添加少于 4 个符号的缺失零](https://linux22.com/image/158473/%E5%9C%A8%E6%AF%8F%E8%A1%8C%E5%BC%80%E5%A4%B4%E6%B7%BB%E5%8A%A0%E5%B0%91%E4%BA%8E%204%20%E4%B8%AA%E7%AC%A6%E5%8F%B7%E7%9A%84%E7%BC%BA%E5%A4%B1%E9%9B%B6.png)
我想问你如何解决这个问题:我需要在单词少于 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
对于zsh
shell,您可以使用l:length::string:
left-padding 参数扩展标志。
$ var=FF
$ echo ${(l:4::0:)var}
00FF
要将其应用于文件中的每个单词:
printf '%s\n' ${(l:4::0:)$(<file)}
请注意,该运算符还截断超过 4 个字符的单词。