Enésima palavra em uma variável de string


87

No Bash, quero obter a enésima palavra de uma string mantida por uma variável.

Por exemplo:

STRING="one two three four"
N=3

Resultado:

"three"

Que comando / script Bash poderia fazer isso?

Respostas:


99
echo $STRING | cut -d " " -f $N

3
o corte falhará ao solicitar um campo que não existe. Em vez de retornar "", ele retornará a própria string. Exemplo: echo "aaaa" | O resultado cut -f2 é "aaaa", não o resultado de comprimento zero em branco.
ajaaskel

@ajaaskel Isso parece acontecer quando o delimitador não é encontrado na entrada. E esse comportamento pode hoje em dia ser alterado usando a opção --only-delimited.
Samuli Pahaoja de

64

Uma alternativa

N=3
STRING="one two three four"

arr=($STRING)
echo ${arr[N-1]}

3
Usar arrays bash para essa é "a melhor" solução, odeio usar awk ou sed, pois não os vejo instalados em todas as configurações, especialmente na configuração msys.
Sundar

1
Mesmo que o eco "não seja necessário", achei útil para entender como usar os elementos arr. Obrigado
Chen Li Yong

1
Se você configurou IFS(o separador de campo interno) para ':' ou algo em vez de espaço em branco, altere-o de volta antes de tentar isso.
Noumenon de

1
Esta deve ser a resposta certa. Usar arrays para esse propósito é simples e inteligente.
ajaaskel

32

Usando awk

echo $STRING | awk -v N=$N '{print $N}'

Teste

% N=3
% STRING="one two three four"
% echo $STRING | awk -v N=$N '{print $N}'
three

9

Um arquivo contendo algumas declarações:

cat test.txt

Resultado:

This is the 1st Statement
This is the 2nd Statement
This is the 3rd Statement
This is the 4th Statement
This is the 5th Statement

Então, para imprimir a 4ª palavra deste tipo de declaração:

cat test.txt |awk '{print $4}'

Resultado :

1st
2nd
3rd
4th
5th

2
O OP diz que a string está em uma variável, não em um arquivo.
codeforester

3

Sem garfos caros, sem tubos, sem bashismos:

$ set -- $STRING
$ eval echo \${$N}
three

Mas tome cuidado com as bolhas.


2
STRING=(one two three four)
echo "${STRING[n]}"

2
Em seu exemplo, STRING é realmente uma string? Parece uma matriz.
Nicolas Raoul

@NicolasRaoul Sim, na verdade você está certo. Mas escrevi para ser uma alternativa para.
mnrl de
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.