torr para corresponder a zero ou mais números de espaços em uma string

2
function getVal {
  sedPattern='s/^.*"keyVal":"\([^"]*\)".*$//'
  finalSedPattern=${sedPattern/keyVal/$2}
  echo $(sed $finalSedPattern  <<< $1)
}

Este é meu analisador Json escrito usando sed . Ele pega a string json, nome da chave e retorna o valor como

myJson='{"hello":"sk"}'
val=$(getVal $myJson hello)
echo $val

imprime, sk

Mas às vezes, minha string json pode ou não conter espaço como

myJson='{"hello" : "sk"}'

Nesse caso, a função falha. Tentei ajustar o padrão acima adicionando [ ] para corresponder a zero ou mais espaços,

sedPattern='s/^.*"keyVal"[ ]+:"\([^"]*\)".*$//'

Ele gera um erro,

unterminated 's' command

Como posso dar grupos padrão não capturáveis dentro do sed?

    
por Madhavan Kumar 26.12.2015 / 13:40

2 respostas

2

Seu sedPattern tem algum problema com as cotações. você está tentando igualar a mesma cotação duas vezes. Além disso, + é usado para um ou mais. para 0 ou mais, use *.
cuidado: o código abaixo não foi testado, mas você deve ir.

sedPattern='s/^.*"keyVal"[ ]*:.*\(".*"\).*$//'

    
por 26.12.2015 / 16:23
1

Você deve citar expansões de variáveis (apenas um exemplo do seu código):

sed $finalSedPattern

não é citada e será dividida em espaços (quando usada). Você deve usar:

sed "$finalSedPattern"

Sua função com aspas:

function getVal {  
    sedPattern='s/^.*"keyVal":"\([^"]*\)".*$//1'
    finalSedPattern="${sedPattern/keyVal/$2}"
    echo "$(sed "$finalSedPattern"  <<< "$1")"
}

E com espaços opcionais:

function getVal {
    sedPattern='s/^.*"keyVal"[ ]\{0,\}:[ ]\{0,\}"\([^"]*\)".*$//1'
    finalSedPattern="${sedPattern/keyVal/$2}"
    echo "$(sed "$finalSedPattern"  <<< "$1")"
}
    
por 26.12.2015 / 16:29