如何从bash文件中获取字符串?

时间:2019-02-10 12:23:07

标签: bash

我的文件不是不是 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'

但是我知道了所有的名字

2 个答案:

答案 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