Совместно используйте 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
)
Вы могли поддержать прокручивающийся буфер с двумя строками, печатая первую строку, только если она не соответствует Вашему шаблону с двумя строками:
$ 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'