【问题标题】:Grep from txt file (JSON format)来自 txt 文件的 Grep(JSON 格式)
【发布时间】:2020-02-06 15:36:03
【问题描述】:

我有一个 JSON 格式的 txt:

{
  "items": [ {
    "downloadUrl" : "some url",
    "path": "yxxsf",
    "id" : "abc",
    "repository" : "example",
    "format" : "zip",
    "checksum" : {
      "sha1" : "kdhjfksjdfasdfa",
      "md5" : "skjfhkjshdfkjshfkjsdhf"
    }
  }],
  "continuationToken" : null
}

我想使用 grep 提取下载 url 上下文(在本例中我想要“一些 url”)并将其存储在另一个 txt 文件中。 TBH 我从来没有用过 grep

【问题讨论】:

  • 请将实际文件内容复制并粘贴到您的问题中,而不是张贴图片。那么,grep 是 JSON 解析的错误工具;您应该为此使用jq 之类的东西。最后,如果你从未使用过 grep,你会觉得你在期待别人来做你的工作;你必须先自己努力。
  • 我期待 grep 的语法可以找到那个特定的 url。感谢您的时间。我对此进行了研究并找到了使用正则表达式的解决方案

标签: json bash shell grep


【解决方案1】:

使用grep

grep -oP 'downloadUrl"\s:\s"(.*)",' myfile > urlFile.txt

查看此正则表达式的实际操作:https://regex101.com/r/DvnXCO/1


更好的方法是使用jq

下载jq Windows 版:https://stedolan.github.io/jq/download/

jq ".items[0].downloadUrl" myfile > urlFile.txt

【讨论】:

  • 我想只用 grep 那个命令也复制了 downloadUrl" : "some url", 我只想要一些 url 没有逗号没有冒号
  • @Peace9795,请注意 grep 解决方案容易失败。例如:"downloadUrl": 标签和 "some url" 可以位于不同的行上,这仍然是有效的 JSON,但会破坏基于 grep 的解决方案
【解决方案2】:

虽然 json string 可能包含被转义的双引号字符 反斜杠,URL 中的双引号和反斜杠都应该是 根据 RFC 3986 进行百分比编码。然后您可以使用以下命令提取 URL:

tr "[:space:]" " " < file.json | grep -Po '"downloadUrl"\s*:\s*\K"[^"]+"'
  • 让我用tr预处理json文件来转换所有blank 字符到空格。然后以下grep 将起作用 如果名称和值对位于单独(但连续)的行中。
  • 正则表达式中的\K 运算符是一个可变长度的后视,没有 在匹配结果中包含前面的模式。

请注意,上面的命令适用于提供的示例,但可能不适用于 对于任意输入足够健壮。我仍然建议使用jq 出于严格的目的。

【讨论】:

  • grep -oP 'some..([^"]+)*' 非常适合我。谢谢你的回答。真的很感激
  • @Peace9795 感谢您的反馈。很高兴知道它有效。如果您认为我的回答很好地解决了您的问题,如果您可以通过单击答案旁边的复选标记接受它,我将不胜感激。 BR。
【解决方案3】:

如果你只想使用 grep:

grep downloadURL myfile > new_file.txt

如果您更喜欢更简洁的选项,请添加cut 命令:

grep downloadURL myfile | cut -d\" -f4 > new_file.txt

顺便说一句,json 文件的图像显示您正在使用记事本(Windows?)

【讨论】:

  • 是的,我在 Windows 上运行 bash 脚本来获取 url。我使用 curl 来获取该信息并将其放入 txt 文件中
  • 它没有用。新文件为空仅供参考:我只想提取“一些 url”(如果您看到文本文件)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 2012-03-19
  • 2022-01-13
相关资源
最近更新 更多