Вы можете сделать это с помощью sed
довольно легко с парой групп захвата и парой обратных ссылок вместе с \U
(для верхнего регистра) и \L
(для нижнего регистра), например,
sed 's/\(^\w*\):\(.*$\)/\U\1: \L\2/' file
Выше первой группы захвата привязывается к началу строки с помощью '^'
и захватывает все символы слова \w
, затем ':'
, а затем - до конца строки.
Преобразование замены все в верхнем регистре с \U
, добавляет пробел после ':'
и затем преобразует остальное в нижний регистр с \L
.
Пример использования / Вывод
$ sed 's/\(^\w*\):\(.*$\)/\U\1: \L\2/' file
HUGH: is missing
LORY: is doing well
TIFANY: is sick
MELODY: is back
HENRY: is dead
JACK: is sleeping
Использование расширенного регулярного выражения
Примерно эквивалентная, но несколько более надежная команда с использованием Расширенные регулярные выражения будет иметь вид:
sed -E 's/(^\w+):(.*$)/\U\1: \L\2/'
Где '+'
для повторения требуется 1 или более слов для сопоставления, а не '*'
(ноль или более) для совпадения с Basi c Регулярными выражениями , и вам не нужно экранировать группа захвата (...)
. Недостатком является не только поддержка ERE, но большинство делают это с опцией -E
или -r
.
( примечание: нет, я не знаю, что случилось с "Hugh"
в вашем примере - он должен быть удален?)