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?
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:
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.
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:
por que envolver read? Não é isso readque faz a divisão - é $IFS. Por alguma razão, muitas pessoas consideram aceitável dividir w / $IFSonly 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.
x
antes da substring que você deseja extrair?Respostas:
Tente desta maneira:
echo $x
exibe o valor dex
.awk '{print $2}'
imprime o segundo campo do exibido anteriormentex
.$(
...)
segure a saída e deixe atribuí-la ay
.fonte
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 anteriormentex
.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:
resultado
fonte
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 seXPG_ECHO
está definido. Supondo que a sequência não contenha seqüências de escape, isso deve ser bom, masprintf '[%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:
NF
número de campo no registro atualusando sed:
usando expressão de string:
usando grep:
-o é fornece apenas correspondência exata,
[a-z]+
corresponderá à letra de az e$
significa no finalfonte
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 seXPG_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 deprintf '%s\n' "${a##* }"
que seria melhor.É possível usar matrizes bash para isso, por exemplo:
fonte
Você pode usar o
read
built-infonte
read
? Não é issoread
que faz a divisão - é$IFS
. Por alguma razão, muitas pessoas consideram aceitável dividir w /$IFS
only quandoread
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 usandoIFS
, 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ãoIFS
aqui, mas é fácil suficiente para definir, se necessário,IFS=$' \n\t' read -r _ y <<<"$x"
irá fazer o truqueread
atribui,$IFS
divide. se você deseja preencher uma matriz, useset
- você não precisa do absurdo artificial da string aqui nesse caso.unset IFS
obtém o comportamento padrão $ IFS.