【问题标题】:Pad one-digit, two-digit and three-digit numbers with zeros with sed用 sed 填充一位、两位和三位数字
【发布时间】:2017-10-06 04:59:56
【问题描述】:

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

file.txt:

2
22
222
2222
a2a2
2a2a
a22a
2aa2
22a2

output.txt:

0002
0022
0222
2222
a0002a0002
0002a0002a
a00022a
0002aa0002
0022a0002

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

我必须使用sed 命令来完成。我想过这样做,但它并没有像我想要的那样工作。

sed -r -i 's/[0-9]{1}/0&/g' file.txt

【问题讨论】:

  • I have to do it with the sed command - 为什么? sed 是完全错误的工作工具。就像说你必须用螺丝刀种一棵树。
  • 也许他们在一个带有 sed 但没有 AWK 的嵌入式系统上(我知道,我知道,busybox 两者都有)。或者带有sed.exe 二进制文件但没有AWK 的Windows 系统。也许这是 Unix 编程课的作业。也许他们只是想舒展一下自己的大脑,或者对sed 变得非常好。我的意思是,当几乎每个 Unix 都已经有 dc 时,为什么还有人写 an RPN calculator in sed

标签: bash awk sed pad


【解决方案1】:
$ sed -E 's/([[:digit:]]+)/000&/g;s/0+([[:digit:]]{4})/\1/g' file.txt
0002
0022
0222
2222
a0002a0002
0002a0002a
a0022a
0002aa0002
0022a0002

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

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

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

第二次替换删除了多余的零。

【讨论】:

    【解决方案2】:

    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
    

    输出:

    0002
    0022
    0222
    2222
    a0002a0002
    0002a0002a
    a0022a
    0002aa0002
    0022a0002
    

    【讨论】:

    • OP 使用sed 请求解决方案。
    • @TheDudeAbides,您可以先确定“OP”概念在这里是否仍然实际/相关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 2015-10-16
    • 2021-01-27
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多