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?

Antworten:


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

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

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

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

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.


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.