根据下一行删除上一行的 Sed 命令

根据下一行删除上一行的 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

您可以维护一个滚动的两行缓冲区,仅当第一行与您的两行模式不匹配时才打印第一行:

$ 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'

相关内容