提取双引号内的字符串-为什么sed命令不起作用而grep -o起作用?

亚瑟·阿乔里

我有一个包含多个字符串的大日志文件,并且尝试获取ClOrdID字段,例如:

ClOrdID="123456"
ClOrdID="123654"
(...)

在此文件的中间,我有带有以下消息的字符串:

$$ grep -i "Message processing FAILED" mylog | head -1
2020-10-02 09:30:00,622 ERROR [LAWT1] etc... etc... - Message processing FAILED: <NewOrderSingle etc.. MsgType="D" ClOrdID="123456" Rule80A="A" etc.../></NewOrderSingle>

我意识到,如果我使用“ grep -o”,我可以得到我想要的:

$$ grep -i "Message processing FAILED" mylog | grep -o '\sClOrdID=\".[^.\"]*\"' | sed 's/ //g' | head -1
ClOrdID="123456"

但是,如果我尝试使用sed,它将无法正常工作。它打印ClOrdID及其后的所有其他内容(除了结尾部分... NewOrderSingle>):

$$ grep -i "Message processing FAILED" mylog | sed -rn 's/.* (ClOrdID=".*)" .*/\1/p' | head -1
ClOrdID="123456" Rule80A="A" etc...

有人可以帮助我找出sed命令出了什么问题吗?我正在尝试更加熟悉sed。

阿努巴瓦

您可能可以使用sed使用否定的字符类[^"]*而不是贪婪的字符集.*[^"]匹配所有非字符,".匹配任何字符,".*"并将匹配直到"输入的最后一个字符。

sed -rn 's/.* (ClOrdID="[^"]*") .*/\1/p'

另外,您必须继续关闭:捕获组内部。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章