来自地图对象的 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)
#!/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
我正在尝试提取客户端对象中的每个用户名值并存储在数组中 (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)
#!/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