我有以下字符串:
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/