Ich habe zum Beispiel einen Befehl : echo "word1 word2"
. Ich möchte eine Pipe ( |
) setzen und word1 vom Befehl erhalten.
echo "word1 word2" | ....
Ich weiß nicht, was ich nach der Pfeife setzen soll.
Awk ist eine gute Option, wenn Sie sich mit nachgestellten Leerzeichen befassen müssen, da dies für Sie erledigt wird:
echo " word1 word2 " | awk '{print $1;}' # Prints "word1"
Cut kümmert sich aber nicht darum:
echo " word1 word2 " | cut -f 1 -d " " # Prints nothing/whitespace
'cut' hier druckt nichts / Leerzeichen, weil das erste, was vor einem Leerzeichen stand, ein anderes Leerzeichen war.
-F","
das Standardfeldtrennzeichen (ein Leerzeichen) mit einem Komma überschreiben.Es müssen keine externen Befehle verwendet werden. Bash selbst kann den Job machen. Angenommen, "word1 word2" stammt von irgendwoher und ist in einer Variablen gespeichert, z
Jetzt können Sie einer anderen Variablen $ 1 oder $ 2 usw. zuweisen, wenn Sie möchten.
quelle
stdin
. @Matt M.--
bedeutetstdin
, wird also$string
als übergebenstdin
.stdin
durch Leerzeichen getrennt in Argumente$1
,$2
,$3
usw. - so wie wenn ein heftiger Schlag Programm auswertet Argumente (zB Scheck$1
,$2
etc.), ist dieser Ansatz den Vorteil der Tendenz der Shell nimmt die aufzuspaltenstdin
automatisch in Argumente, für die Beseitigung der Notwendigkeitawk
odercut
.set
legt die Shell-Argumente fest.word1=$(IFS=" " ; set -- $string ; echo $1)
Stellen Sie IFS so ein, dass der Abstand zwischen den Wörtern korrekt erkannt wird. In Klammern setzen, um zu vermeiden, dass der ursprüngliche Inhalt von 1 US-Dollar beeinträchtigt wird.string="*"
. Überraschung.Ich denke, ein effizienter Weg ist die Verwendung von Bash-Arrays:
Sie können Arrays auch direkt in einer Pipeline lesen:
quelle
echo " word1 word2 " | { read -a array ; echo ${array[0]} ; }
string="*"
. Überraschung.while
Syntax, um jedes erste Wort in jeder Zeile abzurufen. Verwenden Sie andernfalls den Boontawee Home-Ansatz. Bitte beachten Sie auch, dassecho "${array[0]}"
dies zitiert wurde, um eine von gniourf-gniourf festgestellte Erweiterung zu verhindern.Dies hat den Vorteil, dass keine externen Befehle verwendet werden und die Variablen $ 1, $ 2 usw. intakt bleiben.
quelle
$1, $2, …
ist eine äußerst nützliche Funktion zum Schreiben von Skripten!Wenn Sie sicher sind, dass keine führenden Leerzeichen vorhanden sind, können Sie die Bash-Parameterersetzung verwenden:
Achten Sie darauf, dass Sie dem einzelnen Raum entkommen. Sehen Sie hier für weitere Beispiele von Substitutionsmuster. Wenn Sie bash> 3.0 haben, können Sie auch die Übereinstimmung regulärer Ausdrücke verwenden, um mit führenden Leerzeichen umzugehen - siehe hier :
quelle
Sie könnten awk versuchen
Mit awk ist es wirklich einfach, ein beliebiges Wort auszuwählen ($ 1, $ 2, ...)
quelle
Shell-Parametererweiterung verwenden
%% *
Hier ist eine andere Lösung mit Shell-Parametererweiterung . Es kümmert sich um mehrere Leerzeichen nach dem ersten Wort. Die Behandlung von Leerzeichen vor dem ersten Wort erfordert eine zusätzliche Erweiterung.
Erläuterung
Die
%%
bedeutet das Löschen die längste mögliche Übereinstimmung von*
(einem Raum , gefolgt von einer beliebigen Anzahl von was auch immer andere Zeichen) im hinteren Teilstring
.quelle
Ich fragte mich, wie viele der Top-Antworten in Bezug auf die Geschwindigkeit gemessen wurden. Ich habe folgendes getestet:
1 @ mattbh's
2 @ ghostdog74's
3 @ boontawee-home's
und 4 @ boontawee-home's
Ich habe sie mit Pythons Zeit in einem Bash-Skript in einem Zsh-Terminal unter macOS gemessen, wobei ich eine Testzeichenfolge mit 215 Wörtern aus 5 Buchstaben verwendet habe. Hat jede Messung fünfmal durchgeführt (die Ergebnisse waren alle für 100 Schleifen, am besten von 3) und hat die Ergebnisse gemittelt:
Gute Arbeit, Wähler 👏 Die Stimmen (zum Zeitpunkt dieses Schreibens) entsprechen der Geschwindigkeit der Lösungen!
quelle
read -a
ist in Bindestrich ungültig).cut schneidet das 1. Feld (-f 1) aus einer Liste von Feldern ab, die durch die Zeichenfolge "" (-d "") begrenzt sind.
quelle
read
ist dein Freund:Wenn sich die Zeichenfolge in einer Variablen befindet:
Wenn Sie in einer Pipe arbeiten: Erster Fall: Sie möchten nur das erste Wort der ersten Zeile:
Zweiter Fall: Sie möchten das erste Wort jeder Zeile:
Diese funktionieren, wenn es führende Räume gibt:
quelle
Da Perl die Funktionalität von awk enthält, kann dies auch mit Perl gelöst werden:
quelle
Ich habe mit einem eingebetteten Gerät gearbeitet, das weder Perl, Awk noch Python hatte, und es stattdessen mit sed gemacht. Es werden mehrere Leerzeichen vor dem ersten Wort unterstützt (die mit den
cut
undbash
-Lösungen nicht behandelt wurden).Dies war sehr nützlich, wenn
ps
nach Prozess-IDs gesucht wurde , da die anderen Lösungen, die hier nur bash verwenden, die ersten Leerzeichen, dieps
zum Ausrichten verwendet werden, nicht entfernen konnten .quelle