首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据模式划分文件

根据模式划分文件
EN

Stack Overflow用户
提问于 2018-10-31 05:46:54
回答 1查看 99关注 0票数 0

我有一个JSON输出作为curl命令的一部分生成,并希望根据模式拆分结果文件:

文件内容如下所示

代码语言:javascript
复制
{
"clusters" : [ {
"name" : "subject",
"version" : "XXX",
"services" : [ {
  "name" : "initiator",
  "config" : {
    "items" : [ {
      "name" : "enableSecurity",
      "value" : "true",
      "sensitive" : false
    }, {
      "name" : "service_config_suppression_server_count_validator",
      "value" : "true",
      "sensitive" : false
    } ]
  },
  "roles" : [ {
    "name" : "intiator-role1",
    "type" : "SERVER",
    "hostRef" : {
      "hostId" : "754389-8989db-8743ty"
    },
    "config" : {
      "items" : [ {
        "name" : "role_creds",
        "value" : "sdfujnvhdsg87909",
        "sensitive" : true
      }, {
        "name" : "serverId",
        "value" : "1",
        "sensitive" : false
      } ]
    },
    "roleConfigGroupRef" : {
      "roleConfigGroupName" : "initiator-group"
    }
  } ]
} ]
},
....bunch of lines in between
..........

 {
  "name" : "subject2",
  "version" : "XXX",
"services" : [ {
  "name" : "ingestor",
  "config" : {
    "items" : [ ]
  },
  "roles" : [ {
    "name" : "ingestor-role1",
    "type" : "service",
    "hostRef" : {
      "hostId" : "754389-8989db-8743ty"
    },
    "config" : {
      "items" : [ {
        "name" : "role_code",
        "value" : "sdfujnvhdsg67340",
        "sensitive" : true
      } ]
    },
    "roleConfigGroupRef" : {
      "roleConfigGroupName" : "ingestor-group"
    }
  } ]
  } ]
  }
  ]
  }

每当字符串"version":"XXX“重复时,我想将这个文件拆分为不同的文件。因此,生成文件内容应该从字符串前两行开始,直到下一个字符串出现。

这只是一个巨大的json文件的摘录,在这个数据集中,我只保留了两个字符串模式,因此需要两个包含以下内容的文件:

文件1应具有:

代码语言:javascript
复制
"clusters" : [ {
"name" : "subject",
"version" : "XXX",
"services" : [ {
  "name" : "initiator",
  "config" : {
    "items" : [ {
      "name" : "enableSecurity",
      "value" : "true",
      "sensitive" : false
    }, {
      "name" : "service_config_suppression_server_count_validator",
      "value" : "true",
      "sensitive" : false
    } ]
  },
  "roles" : [ {
    "name" : "intiator-role1",
    "type" : "SERVER",
    "hostRef" : {
      "hostId" : "754389-8989db-8743ty"
    },
    "config" : {
      "items" : [ {
        "name" : "role_creds",
        "value" : "sdfujnvhdsg87909",
        "sensitive" : true
      }, {
        "name" : "serverId",
        "value" : "1",
        "sensitive" : false
      } ]
    },
    "roleConfigGroupRef" : {
      "roleConfigGroupName" : "initiator-group"
    }
  } ]
} ]
},
....bunch of lines in between
..........

和文件2应该有

代码语言:javascript
复制
 {
  "name" : "subject2",
  "version" : "XXX",
"services" : [ {
  "name" : "ingestor",
  "config" : {
    "items" : [ ]
  },
  "roles" : [ {
    "name" : "ingestor-role1",
    "type" : "service",
    "hostRef" : {
      "hostId" : "754389-8989db-8743ty"
    },
    "config" : {
      "items" : [ {
        "name" : "role_code",
        "value" : "sdfujnvhdsg67340",
        "sensitive" : true
      } ]
    },
    "roleConfigGroupRef" : {
      "roleConfigGroupName" : "ingestor-group"
    }
  } ]
  } ]
  }
  ]
  }

希望通过bash实现这一点,最好是awk,提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-11-01 12:42:03

如果您只想在每次"version“重复时将文件拆分成一个新文件,在"version”之前以2行开头和结尾,您可能可以这样做:

代码语言:javascript
复制
#!/bin/bash
awk '
BEGIN {
    i = 0
}
{   
    prevLn2 = prevLn1
    prevLn1 = currentLn
    currentLn = $0

    if(currentLn ~ /^[ ]{0,}\"version\"/) {
        i++
    }

    if(i > 0) {
        print prevLn2 >> "file" i ".txt"
    }
}
'

这会将前面的两行保存在变量prevLn1和prevLn2中,并且对于输入中的每一行,检查当前行是否与正则表达式版本匹配-这意味着行的开头,然后是零个或多个空格,以及文字文本“^[ ]{0,}\"version\"”。如果匹配,则增加变量i。然后将前面的第二行附加到使用变量i命名的文件。

将代码保存在一个文件中,例如splitfile.sh,并使其成为可执行的chmod 755 splitfile.sh。用法:./splitfile.sh < jsonfile.txt将生成文件file1.txt,file2.txt,file3.txt...在同一目录中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53073330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档