有没有办法通过正则表达式匹配组进行零填充来重新格式化?

Ubu*_*ist 3 perl

9%假设我有一个带有、 22% 100%等等的文件。

是否有 Perl(或其他)正则表达式方法可以将数字分别转换为“009”、022100

perl -p -i -e "s/width: (\d+)%/width_\1/g;" ...
Run Code Online (Sandbox Code Playgroud)

正确返回width_9, width_22, 和width_100,这没关系,但如果有一种聪明而简单的方法来获取\1匹配的组并添加格式,那就太好了。

Wik*_*żew 6

您可以使用

perl -i -pe 's/width: (\d+)%/sprintf "width_%03s", $1/ge' file
Run Code Online (Sandbox Code Playgroud)

在这里,width: (\d+)%matches width: ,然后将一个或多个数字捕获到第 1 组中($1,而不是\1!),并且%紧接着也会消耗一个 char ,并且将匹配替换为width_+ 重新格式化的数字。

请参阅在线演示

#!/bin/bash
s='width: 9%, width: 22%, width: 100%'
perl -pe 's/width: (\d+)%/sprintf "width_%03s", $1/ge' <<< "$s"
Run Code Online (Sandbox Code Playgroud)

输出:

width_009, width_022, width_100
Run Code Online (Sandbox Code Playgroud)

  • bdf 表示 `s/width\K: (\d+)%/sprintf "_%03s", $1/ge` (2认同)