Eu tenho uma string "rtcpOnNbActive true"armazenada em uma variável x. Eu quero extrair "true" como substring e armazenar em uma variável. Como posso fazer isso?
Eu tenho uma string "rtcpOnNbActive true"armazenada em uma variável x. Eu quero extrair "true" como substring e armazenar em uma variável. Como posso fazer isso?
Respostas:
Tente desta maneira:
y=$(echo $x | awk '{print $2}')
echo $y
echo $xexibe o valor de x.awk '{print $2}'imprime o segundo campo do exibido anteriormente x.$(... )segure a saída e deixe atribuí-la a y.echo $xé não exibir o valor dex . printf '%s\n' "$x"seria.
awk '{print $2}'imprime o segundo campo de cada linha da exibida anteriormente x.
Supondo que haja pelo menos um espaço antes da substring que você deseja extrair (e que a substring não contenha espaços), você pode fazer isso com uma simples expansão de parâmetro:
x="rtcpOnNbActive true"
y="${x##* }"
echo "[$y]"
resultado
[true]
echonão é portátil para nada além de uma sequência literal que não começa -e não contém nenhuma sequência de escape. Seu comportamento varia até para o bash embutido, dependendo de como foi compilado e se XPG_ECHOestá definido. Supondo que a sequência não contenha seqüências de escape, isso deve ser bom, mas printf '[%s]\n' "$y"ainda é melhor.
echopara exibir o valor de variáveis, mesmo em exemplos de "descarte" como este.
você pode usar o awk:
echo "rtcpOnNbActive true" | awk '{print $NF}'
true
NF número de campo no registro atual
usando sed:
echo "rtcpOnNbActive true" | sed 's/.* //g'
true
usando expressão de string:
a="rtcpOnNbActive true"
echo ${a##* }
true
usando grep:
echo "rtcpOnNbActive true" | grep -Eo "[a-z]+$"
true
-o é fornece apenas correspondência exata, [a-z]+corresponderá à letra de az e $significa no final
echonão é portátil para nada além de uma sequência literal que não começa -e não contém nenhuma sequência de escape. Seu comportamento varia até para o bash embutido, dependendo de como foi compilado e se XPG_ECHOestá definido. Além disso, você deve sempre colocar aspas em expansões de variáveis e substituir comandos (com certas exceções, onde isso não é necessário, mas também não causa nenhum dano). Com uma string como o OP, isso deve ser bom, mas se você quiser ter certeza de printf '%s\n' "${a##* }"que seria melhor.
Você pode usar o readbuilt-in
read -r _ y <<<"$x"
printf "%s\n" "$y"
true
read? Não é isso readque faz a divisão - é $IFS. Por alguma razão, muitas pessoas consideram aceitável dividir w / $IFS only quando readestiver envolvido. Você pode simplesmente fazer: set -f; IFS=' '; printf %.0s%s $xou o que for. Em qualquer caso - você precisa especificar $IFSo valor de aqui.
readfazendo a divisão usando IFS, verifique a documentação . A principal vantagem do uso de leitura é que ele define variáveis (que é um requisito de OP) e, como pode dividir cadeias e preencher uma matriz, é bom para extrair campos arbitrários de uma cadeia. Além disso, estou assumindo padrão IFSaqui, mas é fácil suficiente para definir, se necessário, IFS=$' \n\t' read -r _ y <<<"$x"irá fazer o truque
readatribui, $IFSdivide. se você deseja preencher uma matriz, use set- você não precisa do absurdo artificial da string aqui nesse caso. unset IFSobtém o comportamento padrão $ IFS.
xantes da substring que você deseja extrair?