Замените шаблон по его длине (переносное решение для Bash) - PullRequest
2 голосов
/ 02 мая 2019

Есть ли способ заменить шаблон по его длине на Sed / Awk / Perl? Я ищу небольшие переносимые команды, которые можно использовать в скрипте Bash.

У меня есть строки, которые начинаются с определенного символа (скажем, x), и я хочу заменить эти повторения x их длиной.

So

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

Сед не может быть хорошим кандидатом. Я знаю, что в Perl есть опция e, которая позволяет выполнять код в строке подстановки, но я не уверен, как он будет использоваться здесь: perl -pe 's/^(x+)/length($1)/e'?

Ответы [ 3 ]

6 голосов
/ 02 мая 2019

Заменить первый шаблон на его длину:

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

Выход:

4 rest of the line
3 again
2 again and again
5 you got my point
2 голосов
/ 03 мая 2019

Он помечен как 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. 
1 голос
/ 02 мая 2019

Вот версия 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...