如何从未格式化的文件中基于正则表达式匹配提取字符串

如何从未格式化的文件中基于正则表达式匹配提取字符串

我有一个从 SQL 查询返回的未格式化文件,我需要从中找到正则表达式匹配并提取后面的数字字符串。该数字括在两个双引号之间。请注意,每行可能会出现多次匹配。文件中还有其他应忽略的特殊字符。这是示例文件:

{ "_id" : "66941672632817171654", "title" : "Some Name (Central)", "stationNameAssoc" : [ { "stationId" : "6248915749115539177", "stationName" : "Default" } ] }
{ "_id" : "4455677484649934117", "title" : "Some Name (Mountain)", "stationNameAssoc" : [ { "stationId" : "7597999415247634177", "stationName" : "Default" } ] }

由此,我想在“stationId”后提取一个数字,不包括引号,例如 7597999415247634177。您将如何使用 awk 或 bash 来做到这一点?谢谢

答案1

使用名为 json 的 Json 工具(https://github.com/trentm/json

$ json -ga 'stationNameAssoc.[0].stationId' < input
6248915749115539177
7597999415247634177

或逐步使用它:

cat input | json -ga 'stationNameAssoc' | json -ga stationId

文档位于:http://trentm.com/json/


如果未安装:

install node
and sudo npm install -g json

答案2

另一个 JSON 解析器解决方案,使用jq

$ jq -r '.stationNameAssoc[0].stationId' data.json
6248915749115539177
7597999415247634177

stationId它简单地获取每个数组中第一个(也是唯一一个)数组项的条目的值stationNameAssoc

答案3

awk -F\" '{for(i=1;i<=NF;i++)if($i~/Id/){print $(i+2);next}}' input.txt

相关内容