gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:26:49 25 4
gpt4 key购买 nike

我知道这已被问过 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

我认为问题是该行中涉及的特殊字符太多,我没有写好命令。

最佳答案

因为它是 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"
}

所以我们需要用 lines=lines $0 缓冲 JSON 行,直到在变量 lines 中有一个完整的有效对象。我们使用扩展函数 json_fromJSON() 来确定 if(json_fromJSON(lines,data)==1) 中的有效性。在验证时,对象被解开并存储到数组 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

关于shell - 如何使用 sed/awk 在两个模式之间提取文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58075952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com