我有输入数据:
foo 24
foobar 5 bar
bar foo 125
Run Code Online (Sandbox Code Playgroud)
我想要输出:
foo 024
foobar 005 bar
bar foo 125
Run Code Online (Sandbox Code Playgroud)
所以我可以使用这个 sed 替换:
s,\([a-z ]\+\)\([0-9]\)\([a-z ]*\),\100\2\3,
s,\([a-z ]\+\)\([0-9][0-9]\)\([a-z ]*\),\10\2\3,
Run Code Online (Sandbox Code Playgroud)
但是,我可以做一个替换,那样做吗?就像是:
if (one digit) then two leading 0
elif (two digits) then one leading 0
Run Code Online (Sandbox Code Playgroud)
问候。
我怀疑“if - else”逻辑是否可以合并到一个替换命令中而不保存中间数据(例如匹配的长度)。不过,这并不意味着您不能轻松做到。例如:
$ N=5
$ sed -r ":r;s/\b[0-9]{1,$(($N-1))}\b/0&/g;tr" infile
foo 00024
foobar 00005 bar
bar foo 00125
Run Code Online (Sandbox Code Playgroud)
它使用递归,向所有比$N数字短的数字添加一个零,循环结束时无法进行更多替换。该r标签基本上是说:尝试做替换,然后goto r如果找到了能够替代品。在sed 此处查看有关流量控制的更多信息。