Как удалить строчные буквы после второго прописного, найденного в строке? - PullRequest
0 голосов
/ 07 мая 2020

Имею файл с именами:

Smith, John.
Brown, Aaron K.

И хочу получить:

Smith, J
Brown, A K

или лучше:

SmithJ
BrownAK

Можно ли решить эту задачу в bash?

1 Ответ

3 голосов
/ 07 мая 2020

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

Решение 1

Вы хотите использовать какую-то команду в части строки.
Вы можете удалить все символы, отличные от верхнего регистра, из строки с помощью echo "${string}" | tr -cd "[:upper:]".
С sed s/../../e строка, полученная в результате подстановки, передается в оболочку.
Их объединение дает вам:

sed -r 's/([^,]*)(.*)/echo "\1\$(echo "\2" | tr -cd "[:upper:]")"/e' file

Решение 2

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

sed -e 's/,/\n/' file | sed '0~2s/[^A-Z]//g' | paste -d '' - -

Решение 3

Используя tr из первого и paste из второго решения, вы можете избежать sed.
Имейте в виду, что набор символов tr должен включать новую строку.

paste -d '' <(cut -d, -f1 file) <(cut -d, -f2 file | tr -cd ':[A-Z]:\n')

ИМХО, второе решение выглядит лучше всего. Первый работает медленно с большими файлами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...