热门标签 | 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”事物
推荐阅读
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社区 版权所有