如何在Awk中使用单个正则表达式提取多个字符串

我有以下字符串:

Mike has XXX cats and XXXXX dogs.
MikehasXXXcatsandXXXXXdogs

我想用与 X 的数量相对应的数字替换 X:

我试过:

awk '{ match($0, /[X]+/);
  a = length(substr($0, RSTART, RLENGTH));
  gsub(/[X]+/, a) }1'

但它只捕获第一场比赛。

预期输出:

Mike has 3 cats and 5 dogs.
Mikehas3catsand5dogs
Mike has 3 cats and 5 dogs.
Mikehas3catsand5dogs

回答

使用您显示的样本,您能否尝试以下操作。在 GNU 中编写和测试awk(应该适用于任何awk)。

awk '{for(i=1;i<=NF;i++){if($i~/^X+$/){$i=gsub(/X/,"&",$i)}}} 1'  Input_file

示例输出将是:

Mike has 3 cats and 5 dogs.

说明:遍历所有字段(空格分隔)并检查字段是否从当前字段开始X并且只有X到当前字段的结尾,如果是,则全局替换它自己的值(以获取计数)并保存到当前字段本身。然后提到 1 将打印当前行。



注意:根据 Ed sir 的评论(在问题部分下),如果您的字段也可能有其他值,X那么请尝试(这甚至会涵盖XXX456任何列中的值):

awk '{for(i=1;i<=NF;i++){if($i~/X/){$i=gsub(/X/,"&",$i)}}} 1'  Input_file


编辑:由于 OP 的示例已更改,因此在此处添加此解决方案,使用 GNU 编写和测试awk

awk -v RS='X+' '{ORS=(RT ? gsub(/./,"",RT) : "")} 1' Input_file

或者

awk -v RS='X+' '{ORS=(RT ? length(RT) : "")} 1' Input_file

上述代码的输出如下:

  • you can also use `length(RT)` instead of `gsub` for the last solution

以上是如何在Awk中使用单个正则表达式提取多个字符串的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>