Добавление к множественной строке пробела в конце - PullRequest
0 голосов
/ 07 января 2020

У меня есть список строк, для которых я хочу выполнить модификацию, добавив в конце пробел.

Прежде всего, я хочу прописать все строки в верхнем регистре, я смог это сделать, но если есть способ объединить оба sed, это будет потрясающе

 sed  '
s/Hugh:/HUGH:/g ; 
s/Lory:/LORY:/g;
s/Melody:/MELODY:/g;
s/Tifany:/TIFANY:/g;
s/Henry:/HENRY:/g;
s/Jack:/JACK:/g;

'  |  sed '
s/HUGH:/HUGH: /g ; 
s/LORY:/LORY: /g;
s/MELODY:/MELODY: /g;
s/TIFANY:/TIFANY: /g;
s/HENRY:/HENRY: /g;
s/JACK:/JACK: /g;
'  

Первоначальный ввод:

Hugh:IS MISSING 
Lory:Is Doing well 
Tifany:Is sick
Melody:Is back 
Henry:is Dead 
Jack:is sleeping

Результат на данный момент равен

Hugh:IS MISSING 
LORY:Is Doing well 
TIFANY:Is sick
MELODY:Is back 
HENRY:is working 
JACK:is sleeping

То, что я хочу, это

Hugh: IS MISSING 
LORY: Is Doing well 
TIFANY: Is sick
MELODY: Is back 
HENRY: is working 
JACK: is sleeping

Я хочу добавить пробел, не могу понять, как это сделать, и, если возможно, объединить первый sed и второй, создав только один sed или awk. Это будет круто.

Ответы [ 3 ]

2 голосов
/ 07 января 2020

Вы можете сделать это с помощью 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" в вашем примере - он должен быть удален?)

1 голос
/ 07 января 2020

Gnu awk:

awk '
    BEGIN{FS=":";OFS=": "} # Changes the separator
    $1=toupper($1) # Converts lower to upper
' <file>

Результат:

HUGH: IS MISSING 
LORY: Is Doing well 
TIFANY: Is sick
MELODY: Is back 
HENRY: is Dead 
JACK: is sleeping
0 голосов
/ 07 января 2020

Это может работать для вас (GNU sed):

sed -E 's/(hugh|lory|melody|tifany|henry|jack):/\U& /Ig' file

или, более свободно:

sed 's/^\S*:/\U& /' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...