来自地图对象的 Grep 字符串

Grep string from map object

我正在尝试提取客户端对象中的每个用户名值并存储在数组中 (bash)。但是,即使在 regex101.com

中匹配,grep 也无法匹配
//a.txt
username = "fakeuservalue"

clients = [
  {
    username = "user1"
  },
  {
    username = "user2"
  }
]


x=$(cat a.txt | grep -e 'username\s+=\s+\"(.*)\"')
echo $x

有线索吗?我还尝试在“clients”对象上添加另一个检查,以便跳过检索“fakeuservalue”。

您可以使用

x=$(sed -n '/^clients = \[/,/^]$/s/.*username *= *"\(.*\)".*//p' a.txt)

参见the online demo

#!/bin/bash
s='username = "fakeuservalue"

clients = [
  {
    username = "user1"
  },
  {
    username = "user2"
  }
]'
sed -n '/^clients = \[/,/^]$/s/.*username *= *"\(.*\)".*//p' <<< "$s"

输出:

user1
user2

1。使用 grep

提取用户名值
grep -oP '(?<=username = ")[^"]*' a.txt

2。将用户名值分配到数组 arr1.

readarray -t arr1 <<< $(grep -oP '(?<=username = ")[^"]*' a.txt)

3。打印所有数组arr1个元素

printf "%s\n" ${arr1[@]}

4。打印具有 3 个元素

的数组 arr1 中的第一个和最后一个元素
echo "${arr1[0]}"
echo "${arr[2]}"

如果sed是一个选项,你可以使用;

$ x=($(sed -n '/clients = \[/,/]/{/username/s/.*= "\([^"]*\)"//p}' a.txt))
$ echo ${x[0]}
user1
$ echo ${x[1]}
user2