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'