bash - 从文件中提取不满足特定条件的行
问题描述
在以下文件中,我需要获取其中没有以下模式的所有行:
\"\d\d\d\":[
我不想要这条线 ,"memo": {
或者"notice": "delivered on 17"
,我只想要那些有的线\"\d\d\d\":[
,但是他们有\"\d\d\":[
,或者\"\s\d\d\":[
等等。这怎么能用 sed 或 awk 来完成,或者用 jq 做得更好?
我只需要其中没有\"\d\d\d\":[
模式的行,例如\"42 \":[
应该报告。每个消息行,必须有\"\d\d\d\":[
,而不是任何其他变化。比如\"42a\":[
也是错误的,应该报
{
"memo": {
"notice": "delivered on 17"
},
"message": "{\"id\":\"1\",\"401\":[[\" 0\",[\"a\",\"UK\"],[\"b\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}
{
"memo": {
"notice": "delivered on 190"
},
"message": "{\"id\":\"2\",\"424\":[[\" 0\",[\"v\",\"UK\"],[\"9\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}
{
"memo": {
"notice": "delivered on 734"
},
"message": "{\"id\":\"3\",\"432\":[[\" 0\",[\"a\",\"UK\"],[\"9\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"v\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}
{
"memo": {
"notice": "delivered on 1092"
},
"message": "{\"id\":\"888\",\"5 2\":[[\" 0\",[\"v\",\"UK\"],[\"b\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}
作为输出,我需要有这些问题的行的 id 值。
以上的预期输出:id: 888
因为在这一行中存在错误\"5 2\":[
解决方案
解码所有message
s,选择不包含任何key匹配的s \d{3}
,提取它们id
的s。
jq '.message | fromjson | select(any(keys_unsorted[]; test("[0-9]{3}")) | not) .id' file
推荐阅读
- xml - 为什么 jmeter 中的 RESPONSE 将发布数据请求显示为空
- javascript - 如何将多个对象属性绑定到 ngStyle?
- apache-spark - 通过多个键对 Spark 类型安全的聚合进行分组
- android - 如何从 android 应用程序生成类似事件的 Ctrl+v(Paste)?
- version-control - EM 破折号(“-”)在 WinCvs 中更新时被字符替换
- dialogflow-es - 如何使用 Dialogflow 电话网关并在 nodejs 等后端平台中处理它
- javascript - nodejs 中的 Promise 和 async/await
- c++ - volatile sig_atomic_t 的内存安全
- qt - 如何使用Win7设置QTcpServer单独监听端口
- ruby-on-rails - gem 'rails-settings-cached' 是否允许多个设置模型?