Есть ли способ заменить шаблон по длине на 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

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

2
pawamoy 2 Май 2019 в 22:11

2 ответа

Лучший ответ

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

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

Выход:

4 rest of the line
3 again
2 again and again
5 you got my point
6
Cyrus 2 Май 2019 в 19:34

Вот 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
1
P.... 2 Май 2019 в 19:53