有没有一种方法可以使用零填充重新格式化正则表达式匹配组?

3
假设我有一个文件包含 9%22%100% 等等,是否有一种 Perl(或其他)正则表达式的方法可以将这些数字转换为分别为 "009"、022100 的格式?
perl -p -i -e "s/width: (\d+)%/width_\1/g;" ...

正确返回width_9width_22width_100,这是可以的,但如果有一个巧妙而简单的方法可以将匹配的组\1添加格式,那就太好了。


1
提示:\1是一个正则表达式原子(匹配第一个捕获组匹配的内容)。在替换表达式中使用它没有意义。请使用$1 - ikegami
1个回答

6

您可以使用

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

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

请参考在线演示

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

输出:

width_009, width_022, width_100

1
使用\K,您可以忽略模式的一部分,因此您不必在替换侧复制它:s/width: \K(\d+)(?=%)/sprintf "%03s", $1/ge' - brian d foy
2
bdf 表示s/width\K: (\d+)%/sprintf "_%03s", $1/ge - ikegami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接