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 $x
exibe 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]
echo
nã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_ECHO
está definido. Supondo que a sequência não contenha seqüências de escape, isso deve ser bom, mas printf '[%s]\n' "$y"
ainda é melhor.
echo
para 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
echo
nã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_ECHO
está 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 read
built-in
read -r _ y <<<"$x"
printf "%s\n" "$y"
true
read
? Não é isso read
que faz a divisão - é $IFS
. Por alguma razão, muitas pessoas consideram aceitável dividir w / $IFS
only quando read
estiver envolvido. Você pode simplesmente fazer: set -f; IFS=' '; printf %.0s%s $x
ou o que for. Em qualquer caso - você precisa especificar $IFS
o valor de aqui.
read
fazendo 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 IFS
aqui, mas é fácil suficiente para definir, se necessário, IFS=$' \n\t' read -r _ y <<<"$x"
irá fazer o truque
read
atribui, $IFS
divide. se você deseja preencher uma matriz, use set
- você não precisa do absurdo artificial da string aqui nesse caso. unset IFS
obtém o comportamento padrão $ IFS.
x
antes da substring que você deseja extrair?