使用 sed 或 grep 使用多行正则表达式解析 TOML 的一小部分

vin*_*nux 2 regex bash grep sed

我正在尝试使用 sed 解析这一小块 TOML:

[tool.poetry]
name = "myproject"
version = "1.0.0"
description = ""
authors = []
Run Code Online (Sandbox Code Playgroud)

我试过:

cat pyproject.toml | sed -n 's/name = "\(.*\)+"\nversion = "\(.*\)+"/\1 : \2/p'
Run Code Online (Sandbox Code Playgroud)

但它不起作用。关于如何使这项工作的任何想法?我只需要名称和版本密钥。我对 awk、grep 或任何有效的东西持开放态度,只要它是标准工具。我不想求助于 perl 或 python one liner。

Tom*_*ech 9

许多命令行工具(sed、awk、grep 等)默认一次消耗一行输入。因此,您尝试使用\n是行不通的,因为传递给 sed 的行永远不会匹配。

最简单的方法是使用两个命令,而不是尝试同时捕获两个部分:

name=$(awk -F'[ ="]+' '$1 == "name" { print $2 }' file.toml)
version=$(awk -F'[ ="]+' '$1 == "version" { print $2 }' file.toml)
echo "$name : $version"
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,如果第一个字段匹配,则打印第二个(值)。

或者一次性完成所有操作,您可以使用以下方法:

awk -F'[ ="]+' '{ v[$1] = $2 }
  END{ if (v["name"] && v["version"]) print v["name"] " : " v["version"] } ' file
Run Code Online (Sandbox Code Playgroud)

构建一个关联数组,使用每行的第一个字段作为键,第二个字段作为值。如果在处理文件后设置了两个键,则打印结果。