Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用sed解析TOML的一小部分,或者使用多行正则表达式解析grep_Regex_Bash_Sed_Grep - Fatal编程技术网

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

Regex 使用sed解析TOML的一小部分,或者使用多行正则表达式解析grep,regex,bash,sed,grep,Regex,Bash,Sed,Grep,我正试图使用sed解析这一小块TOML: [tool.poetry] name = "myproject" version = "1.0.0" description = "" authors = [] 我试过: cat pyproject.toml | sed -n 's/name = "\(.*\)+"\nversion = "\(.*\)+"/\1 : \2/p' 但它不起作用。你有什么想法可以让它工作吗?我只需要名称和版本密钥。我对awk、grep或任何有效的工具持开放态度,只要它是

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

[tool.poetry]
name = "myproject"
version = "1.0.0"
description = ""
authors = []
我试过:

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

但它不起作用。你有什么想法可以让它工作吗?我只需要名称和版本密钥。我对awk、grep或任何有效的工具持开放态度,只要它是一个标准工具。我不想求助于perl或python一行程序。

您可以使用
sed

name="$(sed -n 's/.*name = "\([^"]*\)".*/\1/p' <<< "$s")"
version="$(sed -n 's/.*version = "\([^"]*\)".*/\1/p' <<< "$s")"
默认情况下,许多命令行工具(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"
在这两种情况下,如果第一个字段匹配,则打印第二个字段(值)

或者,要一次性完成这一切,您可以使用以下方法:

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

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

但如果可以这样做,则可以在每种情况下为不同的awk变量分配
$2
,并在
结束
块中打印它们,从而使其只运行一次。@CharlesDuffy true,我添加了一个例子来说明这一点。请特别参阅antonio在链接副本中的答案,其中包括引号、
=
周围的空格以及您的问题所展示的其他角落案例。
awk -F'[ ="]+' '{ v[$1] = $2 }
  END{ if (v["name"] && v["version"]) print v["name"] " : " v["version"] } ' file