Команда 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
)
-1
задан 29 September 2016 в 22:35

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
2
ответ дан 28 September 2019 в 12:21

Это awk сценарий добивается цели:

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

{
  last=$0;
}

END{
  print;
}
1
ответ дан 28 September 2019 в 12:21
awk '/USING INDEX/ {this=$0; getline; if (! /^[[:blank:]]*\)/) print this} 1'
1
ответ дан 28 September 2019 в 12:21

Другие вопросы по тегам:

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