用长度替换图案(Bash的便携式解决方案)

时间:2019-05-02 19:11:11

标签: bash perl awk sed

是否有一种方法可以用Sed / Awk / Perl替换模式的长度?我正在寻找可以在Bash脚本中使用的小型便携式命令。

我有全部以特定字符开头的字符串(例如x),我想用长度来代替这些x的重复字符。

所以

xxxx rest of the line
xxx again
xx again and again
xxxxx you got my point

将成为

4 rest of the line
3 again
2 again and again
5 you got my point

Sed可能不是一个好的候选人。我知道Perl有一个e选项,可以执行替换字符串中的代码,但是我不确定在这里如何使用它:perl -pe 's/^(x+)/length($1)/e'

3 个答案:

答案 0 :(得分:6)

按长度替换第一个图案:

awk '$1=length($1)' file

输出:

4 rest of the line
3 again
2 again and again
5 you got my point

答案 1 :(得分:2)

它被标记为perl,没有解决方案是perl,因此我将介绍其中一种。

/e

助您一臂之力
#!/usr/bin/env perl; 
use strict;
use warnings;
use Data::Dumper; 

while ( <DATA> ) {
    s/^(x+)/length $1/e;
    print;
}
__DATA__
xxxx rest of the line
xxx again
xx again and again
xxxxx you got my point

或者作为一个单行:

perl -pe 's/^(x+)/length $1/e' file. 

答案 2 :(得分:1)

这里是gawk版本,但是您的perl解决方案更智能,更好。使用xx....函数将前导first捕获到名为gensub的变量中。然后用其长度替换第一列。

awk '{first=gensub(/(^x+).*/,"\\1","g", $0);$1=length(first)}1' file
4 rest of the line
3 again
2 again and again
5 you got my point

可以进一步缩短为:

awk '{$1=length(gensub(/(^x+).*/,"\\1","g", $0))}1' file