【问题标题】:Grep string in between two values Unix两个值之间的Grep字符串Unix
【发布时间】:2020-10-29 16:54:36
【问题描述】:

我有一个如下的 json 数据。需要 grep 值并将其导出到新文件中。

{
"Data":
[
"User": [
      {"Name": "Solomon", "Age":20}, 
      {"Name": "Absolom", "Age":30}, 
   ] 
"Country": [
       {"Name" : "US", "Resident" : "Permanent"},
       {"Name" : "UK", "Resident" : "Temporary"}
]]}

预期结果,

需要grep“User”的值并导出到一个新的文件User.json

用户.json

"User": [
        {"Name": "Solomon", "Age":20}, 
        {"Name": "Absolom", "Age":30}, 
   ]

再次需要 grep "Country" 并导出到 Country.json

Country.json

"Country": [
       {"Name" : "US", "Resident" : "Permanent"},
       {"Name" : "UK", "Resident" : "Temporary"}
]

正在尝试使用 sed,但得到的结果不正确

sed -e 's/.*"User"\(.*\)].*/\1/' Data.json > Users.json

由于有很多特殊字符 ]/[/{/} ,不知道如何正确地 grep 值并将其导出到新文件。

任何建议都会很有帮助

【问题讨论】:

  • 使用 json 感知工具提取 json 数据。使用jq。不,你不能用 sed 编写 json 解析器。
  • 不,不想分割任何数据。我只需要 grep 并将其导出到一个新文件。我也不想使用jq,因为我的linux发行版没有jq
  • 同样,这不是一个有效的 JSON 值。数组不能有"key": "value" 形式的元素。
  • 是的,它不是一个有效的 JOSN,原因是我只想 grep 所需的记录并导出到一个新文件中
  • 好的,但问题正文说它是一个 json,这是错误的,可能会产生误导。

标签: unix awk sed grep


【解决方案1】:

您的输入不是有效的 JSON,但是,对于解析 JSON,您可以使用 jq,例如,稍微修改您的输入,试试这个:

 $ echo  '{
   "Data":[
      {
         "User":[
            {
               "Name":"Solomon",
               "Age":20
            },
            {
               "Name":"Absolom",
               "Age":30
            }
         ],
         "Country":[
            {
               "Name":"US",
               "Resident":"Permanent"
            },
            {
               "Name":"UK",
               "Resident":"Temporary"
            }
         ]
      }
   ]
}'| jq  -cr .'Data[] | with_entries(select(.key == "User"))';

它将输出(对于用户):

{"User":[{"Name":"Solomon","Age":20},{"Name":"Absolom","Age":30}]}

如果你使用| jq -cr .'Data[] | with_entries(select(.key == "Country"))';(国家)

{"Country":[{"Name":"US","Resident":"Permanent"},{"Name":"UK","Resident":"Temporary"}]}

这只是众多可能方法中的一种,但我希望它能给你一个想法。

【讨论】:

    【解决方案2】:

    如果运气好的话,您可以使用带有-z 选项的GNU sed 并过滤内容直到关闭],假设字符串中没有]

    sed -z 's/.*\("User":[^]]*]\).*/\1\n/'
    sed -z 's/.*\("Country":[^]]*]\).*/\1\n/'
    

    【讨论】:

    • sed -z 无法正常工作,出现sed -z illegal option 错误
    • 当然,安装GNU sed。您可以将输入中的所有换行符替换为某些内容,然后使用sed,然后将这些字符替换回换行符。而且,如果您使用的是 BSD 或 OSX,最好在问题中指定您的环境。
    猜你喜欢
    • 2014-12-08
    • 2021-10-05
    • 1970-01-01
    • 2017-11-11
    • 2015-09-04
    • 2014-10-03
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    相关资源
    最近更新 更多