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?


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.

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]

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


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]}

2

Você pode usar o readbuilt-in

read -r _ y <<<"$x"
printf "%s\n" "$y"
true

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.