Bash 用sed填充一位、两位和三位数字的零

Bash 用sed填充一位、两位和三位数字的零,bash,awk,sed,pad,Bash,Awk,Sed,Pad,我正在编写一个bash脚本,它用零填充一位数、两位数和三位数。例如: file.txt: output.txt: 此脚本的目的是填充数字,直到它们达到最大4位数 我必须用sed命令来做。我曾想过这样做,但没有达到我想要的效果 sed -r -i 's/[0-9]{1}/0&/g' file.txt GNU awk解决方案: awk -v FPAT='[0-9]+|[^0-9]+' '{ for (i=1;i<=NF;i++) printf ($i~/[0-

我正在编写一个bash脚本,它用零填充一位数、两位数和三位数。例如:

file.txt:

output.txt:

此脚本的目的是填充数字,直到它们达到最大4位数

我必须用sed命令来做。我曾想过这样做,但没有达到我想要的效果

sed -r -i 's/[0-9]{1}/0&/g' file.txt
GNU awk解决方案:

awk -v FPAT='[0-9]+|[^0-9]+' '{ 
           for (i=1;i<=NF;i++) printf ($i~/[0-9]/? "%04d":"%s"),$i; 
           print "" 
       }' file.txt
GNU awk解决方案:

awk -v FPAT='[0-9]+|[^0-9]+' '{ 
           for (i=1;i<=NF;i++) printf ($i~/[0-9]/? "%04d":"%s"),$i; 
           print "" 
       }' file.txt
第一次替换在行中的每一组数字前加上000。第二次替换从每组数字的开头删除零,直到只剩下四个数字

因此,第一次替换后的中间输出为

$ sed -E 's/([[:digit:]]+)/000&/g' file.txt
0002
00022
000222
0002222
a0002a0002
0002a0002a
a00022a
0002aa0002
00022a0002
第二次替换将删除多余的零

第一次替换在行中的每一组数字前加上000。第二次替换从每组数字的开头删除零,直到只剩下四个数字

因此,第一次替换后的中间输出为

$ sed -E 's/([[:digit:]]+)/000&/g' file.txt
0002
00022
000222
0002222
a0002a0002
0002a0002a
a00022a
0002aa0002
00022a0002

第二个替换将删除多余的零。

我必须使用sed命令来完成这项工作-为什么?sed对于这项工作来说是完全错误的工具。这就像说你只需要用螺丝刀就可以种一棵树。也许他们在一个带有sed的嵌入式系统上,但没有AWK我知道,我知道,busybox两者都有。或具有sed.exe二进制文件但没有AWK的Windows系统。也许这是Unix编程课的家庭作业。也许他们只是想开动脑筋,或是想和sed好好相处。我的意思是,为什么有人在几乎所有Unix都已经有dc的情况下还要写呢?我必须用sed命令来写——为什么?sed对于这项工作来说是完全错误的工具。这就像说你只需要用螺丝刀就可以种一棵树。也许他们在一个带有sed的嵌入式系统上,但没有AWK我知道,我知道,busybox两者都有。或具有sed.exe二进制文件但没有AWK的Windows系统。也许这是Unix编程课的家庭作业。也许他们只是想开动脑筋,或是想和sed好好相处。我的意思是,为什么有人在几乎每个Unix都已经有dc的情况下还要写呢?OP要求使用sed解决方案。@udebadies,您可以首先确定OP概念在这里是否仍然是实际的/相关的。OP要求使用sed解决方案。@udebadies,您可以首先确定OP概念在这里是否仍然是实际的/相关的。
$ sed -E 's/([[:digit:]]+)/000&/g;s/0+([[:digit:]]{4})/\1/g' file.txt
0002
0022
0222
2222
a0002a0002
0002a0002a
a0022a
0002aa0002
0022a0002
$ sed -E 's/([[:digit:]]+)/000&/g' file.txt
0002
00022
000222
0002222
a0002a0002
0002a0002a
a00022a
0002aa0002
00022a0002