我的文件不是不是 JSON 而且我想从文件中获取字符串“ name”,但只能获取键类型为“ typeX”的名称 输入:
ID : id
mySer:
- name : xyz
type : typeX
myServ2:
- name : wyz
params:
- name :ppp
输出
name : xyz
or xyz
我尝试过
awk '/"name":/{flag=1;next}/^$/{flag=0}flag'
但是我知道了所有的名字
答案 0 :(得分:1)
如果yq
可用,请尝试:
yq -r '.[][]? | select (.type == "typeX") | .name' file.yml
输出:
xyz
file.xml
如下:
ID : id
mySer:
- name : xyz
type : typeX
myServ2:
- name : wyz
params:
- name :ppp
(发布的文件看起来像在params
行中缩进了。)
在大多数平台上,您可以使用以下命令安装yq
:
$ pip install yp
在使用yq
之前,还必须安装其依赖项jq
。
答案 1 :(得分:0)
test.yml:
ID : id
mySer:
- name : xyz
type : typeX
myServ2:
- name : wyz
params:
- name :ppp
myExample:
- name : levi
type : typeX
test.sh:
#!/bin/bash
str=`cat test.yml`;
function match {
MATCHES=()
local mstr=$1 re="($2)(.*)"
while [[ -n $mstr && $mstr =~ $re ]]; do
MATCHES+=("${BASH_REMATCH[1]}")
mstr=${BASH_REMATCH[2]}
done
}
match "$str" 'name : [a-zA-Z0-9]+\s+type : typeX'
for (( v=0; v < ${#MATCHES[@]}; v++)); do
echo ":: ${MATCHES[$v]}";
done
输出:
:: name : xyz
type : typeX
:: name : levi
type : typeX
但是,如果只想查看名称行,则可以将其通过管道传递到grep(| grep name)中,其中仅显示名称,然后输出将如下所示:
:: name : xyz
:: name : levi