Bash 脚本 - 在 grep 正则表达式中获取`(.*)`(点星)的结果

APi*_*als 4 grep shell-script regular-expression

假设我在 Bash 脚本变量中有以下 JSON 字符串DATA

{
    "id": 10,
    "name": "Person 1",
    "note": "This is a test"
}
Run Code Online (Sandbox Code Playgroud)

我需要获取该name字段的值。我用过grep这样的:

NAME=$(echo "$DATA" | grep -E "\"name\": \"(.*)\"")
Run Code Online (Sandbox Code Playgroud)

但是,这将返回"name": "Person 1"。我需要Person 1。我怎样才能得到结果(.*)

jor*_*anm 7

你可以很容易地做到这一点jq

$ DATA='{
    "id": 10,
    "name": "Person 1",
    "note": "This is a test"
}'
$ jq -r '.name' <<<"$DATA"
Person 1
Run Code Online (Sandbox Code Playgroud)

一般来说,解析html、json、yaml等结构化数据时最好避免使用正则表达式。

要使用 grep 完成此操作,您需要使用 PCRE 来利用前瞻和后视:

$ echo $DATA | grep -Po '(?<="name": ").*(?=")'
Person 1
Run Code Online (Sandbox Code Playgroud)