我有以下日志:
2016/01/20 00:00:16.035 [T114BaseServlet] ... Blah Blah Blah
2016/01/20 00:00:16.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
2016/01/20 00:00:29.531 [T114BaseRequestPayloadParser] ... Blah Blah Blah
2016/01/20 00:00:36.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
我想删除这些ApplicationState
行,但这些行的末尾没有模式Blah Blah Blah
。
这是我要删除的块:
2016/01/20 00:00:16.036 [ApplicationState] ... Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
在下一个请求开始之前。
答案1
要删除从 1 开始的整个行块,包括您的匹配项,直到下一次出现的行之前出现的行,[T1114Base
您可以执行以下操作:
sed -e'$!N;/ApplicationState.*\n/,/\n.*\[T1114Base/!P;D' <in >out
理解其工作原理相当简单。默认情况sed
下一次吃一行输入。但如果你想要更广阔的视野,你只需要编写脚本即可。
因此,对于每个输入行,如果当前行不是!
最后$
一行,则将 ext 行sed
附加到由插入的ewline 字符N
分隔的模式空间。\n
在范围表达式中,我首先查找任何匹配项ApplicationState
后跟任意*
数量的任意.
字符,后跟至少一个\n
ewline。要结束范围表达式,我需要查看输入 - 这$!N
首先是 的目的。sed
扫描下一次出现的行后最后一个要删除的。它查找一条\n
ewline,后跟一个模式,该模式应与下一个输入块的开头匹配。
如果该范围表达式!
不匹配,sed
将P
打印到\n
模式空间中第一个出现的换行符,并且无论匹配如何,sed
随后都会D
删除模式空间中第一个出现的换行符,并用剩余的内容回收到脚本的顶部。
基本上,sed
一次滑过输入 2 行,P
如果它没有出现在删除块中,则可能会打印最旧的一行,并且D
在附加扩展之前始终仅删除最旧的一行N
。
答案2
你真的尝试过吗?
假设您要删除整行:
sed '/ApplicationState/d' inputfile