如何解决提取双引号内的字符串-为什么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
而不是贪婪[^"]*
的{{1}}。 .*
匹配非[^"]
的任何字符,但"
匹配任何字符,并且.
匹配直到输入中最后一个".*"
。
"
此外,您必须继续关闭捕获组内的sed -rn 's/.* (ClOrdID="[^"]*") .*/\1/p'
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。