N-tes Wort in einer Zeichenfolgenvariablen

85

In Bash möchte ich das N-te Wort eines Strings erhalten, der von einer Variablen gehalten wird.

Zum Beispiel:

STRING="one two three four"
N=3

Ergebnis:

"three"

Welcher Bash-Befehl / welches Bash-Skript könnte dies tun?

Nicolas Raoul
quelle

Antworten:

95
echo $STRING | cut -d " " -f $N
Amardeep AC9MF
quelle
3
Der Schnitt schlägt fehl, wenn ein nicht vorhandenes Feld angefordert wird. Anstatt "" zurückzugeben, wird die Zeichenfolge selbst zurückgegeben. Beispiel: echo "aaaa" | Das Ergebnis von cut -f2 ist "aaaa", kein leeres Ergebnis mit der Länge Null.
Ajaaskel
@ajaaskel Das scheint zu passieren, wenn das Trennzeichen nicht in der Eingabe gefunden wird. Und dieses Verhalten kann heutzutage mit der Option - nur begrenzt - geändert werden.
Samuli Pahaoja
64

Eine Alternative

N=3
STRING="one two three four"

arr=($STRING)
echo ${arr[N-1]}
aioobe
quelle
3
Die Verwendung von Bash-Arrays ist "die beste" Lösung. Ich hasse es, awk oder sed zu verwenden, da sie nicht auf allen Setups installiert sind, insbesondere nicht auf dem msys-Setup.
Sundar
1
Obwohl das Echo "nicht notwendig" ist, fand ich es nützlich, um zu verstehen, wie man die arr-Elemente verwendet. Vielen Dank
Chen Li Yong
1
Wenn Sie IFS(das interne Feldtrennzeichen) auf ':' oder etwas anstelle von Leerzeichen gesetzt haben, ändern Sie es zurück, bevor Sie dies versuchen.
Noumenon
1
Dies sollte die richtige Antwort sein. Die Verwendung von Arrays für diesen Zweck ist sowohl einfach als auch clever.
Ajaaskel
31

Verwenden von awk

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

Prüfung

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

Eine Datei mit einigen Anweisungen:

cat test.txt

Ergebnis:

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

So drucken Sie das 4. Wort dieses Anweisungstyps:

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

Ausgabe :

1st
2nd
3rd
4th
5th
Akhiljith PB
quelle
2
Das OP sagt, dass sich die Zeichenfolge in einer Variablen befindet, nicht in einer Datei.
Codeforester
3

Keine teuren Gabeln, keine Rohre, keine Bashismen:

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

Aber hüte dich vor Globbing.

Jens
quelle
2
STRING=(one two three four)
echo "${STRING[n]}"
mnrl
quelle
2
Ist STRING in Ihrem Beispiel wirklich eine Zeichenfolge? Es sieht aus wie ein Array.
Nicolas Raoul
@NicolasRaoul Ja, eigentlich hast du recht. Aber ich habe geschrieben, um eine Alternative zu sein.
Mnrl