请分享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
您可以维护一个滚动的两行缓冲区,仅当第一行与您的两行模式不匹配时才打印第一行:
$ 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
这个awk
脚本可以达到这个目的:
#!/usr/bin/awk -f
(NR>1 && !(index($0, ")") && index(last, "USING INDEX"))) {
print last;
}
{
last=$0;
}
END{
print;
}
答案3
awk '/USING INDEX/ {this=$0; getline; if (! /^[[:blank:]]*\)/) print this} 1'