$ echo ab aa cc de mn | perl -pe 's/(\w)\1/\1\1\1/g'
ab aaa ccc de mn
Иногда вам просто нужно признать, что есть вещи, которые awk не может сделать, но может perl.
С другой стороны, если вы достаточно хорошо разбираетесь в awk
, чтобы использовать gensub
и хотите делать обратные ссылки -, вам должно показаться, что perl
— пустяк. то есть если вы можете писать на awk, вы можете писать и на perl.
Вы можете использовать эту sed
команду:
$ sed 's/^\(.\)[^ ]*/\1./' file
W. George
A. John
J. Thomas
M. James
Или короче:
$ sed -E 's/^(.)[^ ]*/\1./' file
W. George
A. John
J. Thomas
M. James
Что он делает:
^(.)
. [^ ]*
. \1
представляет первую группу захвата :(.)
. У вас может быть несколько захватов, каждый из которых будет представлен возрастающим числом:\1
первый захват, \2
второй и так далее. Захват выполняется путем заключения шаблона в круглые скобки без флага -E
, экранированного обратной косой чертой.
Похоже, вы хотите заменить первый ряд строчных -букв точкой.
Вы можете сделать это, сопоставив первую подстроку только строчных букв, используя базовое регулярное выражение.
$ sed 's/[[:lower:]]\{1,\}/./' file
W. George
A. John
J. Thomas
M. James
Кроме того, большинство sed
реализаций поддерживают расширенные регулярные выражения, если они используются с параметром -E
.
$ sed -E 's/[[:lower:]]+/./' file
W. George
A. John
J. Thomas
M. James
При таком способе предполагается, что все имена, которые вы хотите сократить, начинаются с заглавной буквы -. К счастью, это довольно распространено.
Использование Raku (, ранее известного как Perl _6)
perl6 -pe 's/^^ (\w+) /{$0.comb[0]}./;'
Пример ввода:
Washington George
Adams John
Jefferson Thomas
Madison James
Пример вывода:
W. George
A. John
J. Thomas
M. James
Вкратце, мы используем оператор подстановки s///
Раку, запрашивая совпадения, которые начинаются с ^^
начала -строки -, захватывая первое \w+
слово с (…)
в захват $0
. Переменная. Вместо этого попросите Raku выполнить код внутри {…}
фигурных скобок, здесьcomb
-присваивая переменной захвата $0
отдельные буквы, затем беря [0]
первую букву, а затем печатая литеральную .
точку.
Можно было (конечно )просто захватить одну букву, требуя, чтобы она была в верхнем регистре:
raku -pe 's/^^ (<upper>) \w* /$0./;'
Второй пример кода (непосредственно выше )дает тот же вывод из Sample Input OP, но также имеет то преимущество, что оставляет (имена без заглавных букв ), такие как «de» в de Gaulle Charles
, нетронутыми..
https://docs.raku.org/syntax/s$SOLIDUS$SOLIDUS$SOLIDUS
https://raku.org