热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

如何使用sed/awk在两种模式之间提取文本

如何解决《如何使用sed/awk在两种模式之间提取文本》经验,为你挑选了1个好方法。

我知道这里已经被问过1000次了,但是我读了很多类似的问题,但仍然没有找到正确的方法。我需要从看起来像这样的一行中提取一个数字:

{"version":"4.9.123M","info":{"version":[2034.2],"description":""},"status":"OK"}

预期产量:

2034.2

该版本号并不总是相同的,但该行的其余部分应该相同。

我曾尝试使用sed,但我对此并不陌生,但失败了:

 sed -e 's/version":[\(.*\),"description/\1/'

输出:

sed: -e expression #1, char 35: unterminated `s' command

我认为问题在于该行中包含太多特殊字符,并且我编写的命令不是很好。



1> James Brown..:

由于它是JSON,因此应使用JSON感知工具进行处理。例如,如果您喜欢awk,则方法是使用GNU awk的JSON扩展。这是一个小方法。

首先下载并编译GNU awk,Gawkextlib和gawk-json的适当版本。这是非常简单的,实际上,只是./configuremake。然后,编写一些代码:

awk '
@load "json"                                 # enable json extension
{
   lines=lines $0                            # read json file records and buffer to var lines
   if(json_fromJSON(lines,data)==1) {        # once the json is complete
       for(i in data["info"]["version"])     # that seems to be an array so all elements
           print data["info"]["version"][i]  # are outputed
       lines=""                              # once done with the first json object
   }                                         # reset the var for more lines
}' file

这次输出:

2034.2

解释更多:

JSON文件结构可以从一行到多行变化,例如:

{"version":"4.9.123M","info":{"version":[2034.2],"description":""},"status":"OK"}

要么:

{
  "version": "4.9.123M",
  "info": {
    "version": [
      2034.2
    ],
    "description": ""
  },
  "status": "OK"
}

因此我们需要使用缓冲JSON行,lines=lines $0直到variable中有一个完整的有效对象为止lines。我们使用扩展函数json_fromJSON()来确定的有效性if(json_fromJSON(lines,data)==1)。验证后,对象将解开并存储到array中data。对于此特定对象,数组的结构为:

data["version"]="4.9.123M"
data["info"]["version"][1]="2034.2"
data["info"]["description"]=""
data["status"]="OK"

我们可以使用此递归数组扫描功能检查对象并产生一些输出:

awk '
@load "json"
function scan(a,p,    q) {           # a is array, p path to it, q is qnd *
    if(isarray(a))
        for(i in a) {
            q=p (p==""?"":"->") i
            scan(a[i],q)
        }
    else
        print p ":" a
}
{
   lines=lines $0
   if(json_fromJSON(lines,data)==1)
       scan(data)                    #
}' file.json

输出:

status:OK
version:4.9.123M
info->version->1:2034.2
info->description:

*)快脏了

这是有关如何从数组输出JSON的简短示例:https : //stackoverflow.com/a/58109715/4162356


@oguzismail老兄,我和`jq`哭了整晚。最终安装了MongoDB,这样我就不再需要使用它了。现在,我从gawk-json开始。这就像在蜂蜜中沐浴。还有牛奶 和awk。
++ ve提供了很好的方法,感谢您分享它,先生,欢呼。
`jq`有自己独特的DSL,这就是为什么我们喜欢它
在_我感觉很好_时选了一个缺口(请参阅,不是本地人)。
@JamesBrown:哈哈!我看到您现在开始一个趋势,带有`awk`的JSON在一段时间内将成为“ the”事物
推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • MongoDB用户验证auth的权限设置及角色说明
    本文介绍了MongoDB用户验证auth的权限设置,包括readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase、cluster相关的权限以及root权限等角色的说明和使用方法。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了Svn和Maven的使用说明,包括版本控制和构建工具的功能和优势。同时提供了一个相关链接,链接中详细介绍了SvnMaven的使用方法和注意事项。通过学习和使用SvnMaven,开发人员可以更好地进行代码管理、软件开发和协作开发,提高项目管理的效率和质量。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
author-avatar
mobiledu2502885853
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有