是否有一种方法可以用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'
?
答案 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