Сокращение начального имени из списка имен в текстовом файле

$ 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.

1
28.09.2021, 18:58
3 ответа

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

2
28.09.2021, 19:15

Похоже, вы хотите заменить первый ряд строчных -букв точкой.

Вы можете сделать это, сопоставив первую подстроку только строчных букв, используя базовое регулярное выражение.

$ 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

При таком способе предполагается, что все имена, которые вы хотите сократить, начинаются с заглавной буквы -. К счастью, это довольно распространено.

1
28.09.2021, 20:23

Использование 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

0
30.09.2021, 01:18

Теги

Похожие вопросы