linux - 如何按名称而不是按固定列从类似 JSON 的文本中提取字段?

标签 linux shell command-line sed cut

我想从文本文件中逐行提取一个子字符串。我需要的信息在特定字段下。例如,我有以下文本:

{name:x, version:1.0, info:"test", ...}
{name:y, version:0.1, info:"test again", ...}
{name:z, version:1.1, info:"test over", ...}

我尝试使用以下命令来提取所有版本:

cut -d',' -f 2 <file name> | cut -d':' -f 2 > <output>

这并不完美。这适用于上面的示例,但如果我有以下条目:

{name:x, info: "test", ..., version:1.2, ...}

上述命令会报告不正确的版本。有什么方法可以根据字段名称而不是按列提取信息?

预期结果:

1.0
0.1
1.1
1.2

最佳答案

使用这个awk:

awk -v f='version' -F ' *[{}:=,] *| +' '{for (i=2; i<=NF; i++) if ($(i-1)==f) 
   {print $i; break}}' file
1.0
0.1
1.1
1.2

关于linux - 如何按名称而不是按固定列从类似 JSON 的文本中提取字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25967460/

相关文章:

在嵌入式设备中使用 ioperm() 与端口通信

c++ - 从命令提示符运行程序并在 C++ 中使用 argv

c++ - 如何从管道传输到标准输入的文件获取输入

java - 如何在JSch中使用SFTP channel 执行shell命令?

android - 使用 adb shell am start 命令传递测试参数

linux - 如何以毫秒为单位获取 2 个日期(Z 格式)之间的差异

c++ - 在C++中,编译-std = c++ 0x需要什么?

linux - 服务器 - 同一主机上的客户端通信

java - 如何在 OpenSUSE 或 Ubuntu 中调出 java 控制台?

regex - 删除文本文件中从第一个空行开始的所有内容