【问题标题】:Formatting a json file to add another field格式化 json 文件以添加另一个字段
【发布时间】:2015-05-20 10:45:17
【问题描述】:

我有一个格式如下的 json 文件。我想修改该文件,以便向其中添加另一个键值对。键应为url,值应为www.mywebsite.co.nz,从下面给出的消息中提取。最简单的方法是什么?

{"  
Timestamp":"Mon Mar 16 21:37:22 EDT 2015","Event":"Reporting  Time","Message":"load for http://xxx.xx.xx.xx:1xxxx/operations&proxy=www.mywebsite.co.nz&send=https://xxx.xx.xx.xx:xxxx/operations?event took 9426 ms (X Time: 306 ms, Y Time: 1923 ms)
StatusCode: Unknown<br>Cookies: nzh_weatherlocation=12; dax_ppv=11|NZH:home|NZH:home|NZH:home|9|undefined; _ga=GA1.4.1415798036.1426208630; _gat=1<br>Links: 225<br>Images: 24<br>Forms: 10<br>Browser: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/41.0.2272.76 Chrome/41.0.2272.76 Safari/537.36<br>CPUs: 2<br>Language: en-GB","UserInfo":"Reporting Time"}

【问题讨论】:

  • 在结尾}前加,"url":"www.mywebsite.co.nz"?我在这里错过了什么吗?
  • :) 我知道。我有大量文件要处理。我不能手动完成。我想通过某种方式使其自动化
  • 为什么不使用像 PHP 或 Python 这样具有内置 JSON 读/写能力的语言?
  • 我可以用python。虽然不是很熟悉
  • 在 PHP 中它只是 $content = file_get_contents('path.json'); $json = json_decode($content); $json-&gt;url = 'www.mywebsite.co.nz'; $content = json_encode($content); file_put_contents('path.json', $content);

标签: json bash awk sed jq


【解决方案1】:

对于perl 用户,使用ojo

perl -Mojo -E '$j=j(b("input.file")->slurp);if($j->{Message}=~m/proxy=(.*?)&/){$j->{url}=$1;say j($j)}'

分解:

  • b()-&gt;slurp - 读取input.file
  • j() - 将 json 转换为 perl 数据
  • 如果Message 包含“proxy=site&” - 获取站点
  • url =&gt; site 添加到数据中
  • j()转成json字符串
  • 并打印出来。

【讨论】:

    【解决方案2】:

    作为jqsed 的组合:

    jq ".url = \"$(jq '.Message' input.json | sed 's/.*proxy=\([^&]*\).*/\1/')\"" input.json > output.json
    

    这包括三个步骤:

    jq '.Message' input.json
    

    从输入的 JSON 中提取消息部分,

    sed 's/.*proxy=\([^&]*\).*/\1/'
    

    从消息中提取域,并且

    jq ".url = \"domainname\"" input.json > output.json
    

    将输入json的.url属性设置为提取的域名,将结果写入output.json

    顺便说一句,我觉得有必要指出,域名本身在技术上并不是一个 URL,因此您可能需要重新考虑该属性名称。

    【讨论】:

    • "www.mywebsite.co.nz" 只是一个例子。关键是它必须从“消息”中提取。很可能是 www.amazon.com
    • 不错。你可以考虑用grep -oP '(?&lt;=proxy=).*?(?=&amp;)' 代替 sed
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 2022-06-24
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多