Sed команда для удаления строки на основе следующей строки

Пожалуйста, поделитесь sed Команда для удаления строки на основе двухстрочной строки.

Например, у меня есть текст ниже:

AAAAA
BBBBBB
 aaa 
bbb
 USING INDEX
)
aaaa
 USING INDEX
        TABLESPACE IDX_TAB3
)

Если строка содержит USING INDEX и следующая строка содержит ) тогда это должно быть удалено. В этом случае я должен удалить только 5-ю строку, но не должен удалять 8-ю строку. Вывод должен быть как ниже:

AAAAA
BBBBBB 
aaa 
bbb
)
aaaa
 USING INDEX
  TABLESPACE IDX_TAB3
)

3 ответа

Вы можете поддерживать скользящий двухстрочный буфер, печатая первую строку, только если он не соответствует вашему двухстрочному шаблону:

$ sed ':a; $!N; /USING INDEX.*\n.*)/!P; D; ba' file
AAAAA
BBBBBB
 aaa
bbb
)
aaaa
 USING INDEX
        TABLESPACE IDX_TAB3
)

Обратите внимание, что приведенное выше допускает ноль или более завершающих символов после USING INDEX шаблон и ноль или более ведущих символов перед ) - если ваш вклад является репрезентативным, т. е. сразу после USING INDEXсразу же после круглых скобок, то вы можете упростить это до

sed ':a; $!N; /USING INDEX\n)/!P; D; ba' file

Это awk скрипт делает свое дело:

#!/usr/bin/awk -f
(NR>1 && !(index($0, ")") && index(last, "USING INDEX"))) {
  print last;
}

{
  last=$0;
}

END{
  print;
}
awk '/USING INDEX/ {this=$0; getline; if (! /^[[:blank:]]*\)/) print this} 1'
Другие вопросы по тегам