Extraindo a segunda palavra de uma variável de sequência

11

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?

Pratibha Jain
fonte
Sempre haverá um espaço xantes da substring que você deseja extrair?
PM 2Ring

Respostas:

21

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.
jherran
fonte
3
echo $xé não exibir o valor dex . printf '%s\n' "$x"seria.
Stéphane Chazelas
2
awk '{print $2}'imprime o segundo campo de cada linha da exibida anteriormente x.
Stéphane Chazelas
9

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]
PM 2Ring
fonte
3
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.
nyuszika7h
1
@ nyuszika7h: Bom ponto, e depois de ler Stéphane Chazelas dizer coisas semelhantes aqui e em outras perguntas recentes, eu realmente devo quebrar meu hábito de usar echopara exibir o valor de variáveis, mesmo em exemplos de "descarte" como este.
PM 2Ring
4

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

Hackaholic
fonte
2
Não poste conteúdo de outra resposta na sua mesma pergunta, por favor.
αғsнιη
1
o que os outros respondem ????
Hackaholic
ele pode salvá-lo na variável que não é um grande negócio aqui
Hackaholic
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.
nyuszika7h
3

É possível usar matrizes bash para isso, por exemplo:

arr="(first second third)"
echo ${arr[1]}
kenorb
fonte
2

Você pode usar o readbuilt-in

read -r _ y <<<"$x"
printf "%s\n" "$y"
true
iruvar
fonte
por que envolver 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.
mikeserv
@ MikeServ, está 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
Iruvar
não, não é. 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.
mikeserv
@ MikeServ, você está fora da minha lista de cartões de Natal.
Iruvar
bah farsa. o xmas é para otários.
mikeserv