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

我有以下字符串:

Mike has XXX cats and XXXXX dogs.
MikehasXXXcatsandXXXXXdogs

我想将 Xs 替换为对应于 Xs 数量的数字:

我试过:

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

但它只捕获第一个匹配项。

预期输出:

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 先生的评论(在问题部分),如果您的字段也可能具有其他 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

以上代码的输出如下:

Mike has 3 cats and 5 dogs.
Mikehas3catsand5dogs

https://stackoverflow.com/questions/66511714/

相关文章:

c++ - 在 C 和 C++ 中, "#"是什么意思?

flutter - 为什么我们应该在 dart 中使用 static 关键字代替抽象?

c++ - 基本 ODR 违规 : member functions in . h 文件

python - 如何使用函数跳出 for 循环?

python - 如何在 Python 中将月份名称生成为列表?

database - 使用golang从postgres中的csv批量插入而不使用for循环

list - 理解实现 foldr 和 foldl 的函数

python - 在 Python 中获取 Windows 版本

python - python中列表列表之间的叉积

javascript - typescript :为什么我们不能为泛型类型分配默认值?