vi - найти закономерность в строках и добавить ";" в конце этих строк

GNUawkрешение:

awk -F'[,=]' '{ gsub(/[({}) ]/,"",$0); for(i=2;i<NF;i+=2) a[$i]=$(i+1); 
                asorti(a,b); for(k in a) print $1,k,a[k] }' file
  • -F'[,=]'-разделитель полей

  • gsub(/[({}) ]/,"",$0)-удаление ненужных символов

  • for(i=2;i<NF;i+=2) a[$i]=$(i+1)-сбор пар значений в массивa

  • asorti(a,b)-сортировать массив aпо ключам


Выход:

0 33 9000.0
0 34 9000.0
0 35 9000.0
0 36 9000.0
2
24.09.2019, 21:17
2 ответа

В дополнение к ответу Фредди вы можете использовать команду :global. Например:

:g/maaa/norm A;

Что означает:

:g/      " On each line matching this regex:
maaa     " 'maaa'
norm A;  " Run 'A;' as if I had manually typed

Вам придется настроить «maaa» на то, что вам нужно, так как из вашего вопроса не ясно, к каким строкам вы хотите применить это. :g/hdfs/norm A;например, добавит точку с запятой к любой строке, содержащей текст «hdfs».

6
27.01.2020, 21:51

Чтобы добавить ;ко всем строкам, заканчивающимся на maaa', вы можете использовать следующую замену. Нажмите Esc , затем введите

.
:%s/maaa'$/&;/

Пояснение:

  • :%s/заменить по одному в каждой строке
  • maaa'$соответствует maaa'в конце строки$
  • /&;/заменить совпадающим шаблоном и;


Чтобы добавить ;ко всем строкам, начинающимся с пробела и 'hdfs://и заканчивающимся ',вы можете использовать следующую замену. Снова нажмите Esc , затем введите
:%s/^ 'hdfs:\/\/.*'$/&;/

Пояснение:

  • :%s/заменить по одному в каждой строке
  • ^ 'hdfs:\/\/.*'$соответствует началу строки ^, за которым следует пробел, за которым следуетhdfs://(/необходимо экранировать с помощью \), за которым следует любой символ .*, за которым следует 'и конец линии$
  • /&;/заменить совпадающим шаблоном и;

Вы всегда можете отменить операцию, нажав Esc + u , если что-то пошло не так.

4
27.01.2020, 21:51

Теги

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