Команда sed, чтобы удалить строку, если шаблон соответствует, и снова найти шаблон в следующих строках, затем удалить его - PullRequest
0 голосов
/ 29 ноября 2018
compute_hosts:
  compute1:
    ip: 12.12.12.12
  compute2:
    ip: 13.13.13.13
#  compute3:
#    ip: 14.13.12.12
#  compute4:
#    ip: 12.23.34.45

metering-compute_hosts:
  compute1:
    ip: 31.13.13.23
  compute2:
    ip: 57.67.575.45
#  compute3:
#    ip: 32.322.4.35
#  compute4:
#    ip: 23.435.67.7

Команда SED для удаления строк, имеющих вычисление 4 и его IP.Поиск по IP должен производиться с использованием ожидаемого шаблона:

compute_hosts:
      compute1:
        ip: 12.12.12.12
      compute2:
        ip: 13.13.13.13
    #  compute3:
    #    ip: 14.13.12.12

 metering-compute_hosts:
      compute1:
        ip: 31.13.13.23
      compute2:
        ip: 57.67.575.45
    #  compute3:
    #    ip: 32.322.4.35

вычислить 4, и его ip должен быть удален в выводе

Ответы [ 4 ]

0 голосов
/ 29 ноября 2018
sed -re '/compute4/ {N;/\s+ip:/d}'

попробуйте это.

N присоединяет следующую строку ввода в пространстве шаблона

test:

$ cat compute | sed -re '/compute4/ {N;/\s+ip:/d}'
compute_hosts:
  compute1:
    ip: 12.12.12.12
  compute2:
    ip: 13.13.13.13
#  compute3:
#    ip: 14.13.12.12

metering-compute_hosts:
  compute1:
    ip: 31.13.13.23
  compute2:
    ip: 57.67.575.45
#  compute3:
#    ip: 32.322.4.35
0 голосов
/ 29 ноября 2018

РЕДАКТИРОВАТЬ: Поскольку OP сообщил следующую строку строки computer4, возможно, не имеет IP, поэтому использование этой функции сопоставления для сопоставления в первой строке.

awk '/compute4/{flag=1;next} flag && match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/){flag="";next} 1'  Input_file


Учитывая, что ваш Input_file такой же, как показанные примеры, не могли бы вы попробовать следующее (если вы в порядке с awk).

awk '/compute4/{getline;next} 1'  Input_file
0 голосов
/ 29 ноября 2018

С awk будет работать следующее:

awk --posix '/compute4/,/[0-9]{1,3}(\.[0-9]{1,3}){3}/{next}{print}' input_file
  • Оператор диапазона /pattern1/,/pattern2/ продолжает возвращать true из строки, которая соответствует /pattern1/, до строки, которая соответствует/pattern2/.
  • Мы хотим исключить строки выше;следующее {next} работает для него.
0 голосов
/ 29 ноября 2018

Этот sed удалит строку с шаблоном и одну строку после:

sed '/compute4/,+1d'

Тест:

$ sed '/compute4/,+1d' compute
compute_hosts:
  compute1:
    ip: 12.12.12.12
  compute2:
    ip: 13.13.13.13
#  compute3:
#    ip: 14.13.12.12

metering-compute_hosts:
  compute1:
    ip: 31.13.13.23
  compute2:
    ip: 57.67.575.45
#  compute3:
#    ip: 32.322.4.35
...