Im Bash-Skript
Ich habe eine Zeichenfolge, die mehrere Wörter enthält, die durch ein oder mehrere Leerzeichen getrennt sind. dh:
Name Age Sex ID Address
Wenn ich eines der Wörter finden möchte, zum Beispiel den Index des Wortes "Alter", wie kann ich das tun?
Gibt es einen Befehl, der die Indexnummer des gewünschten Wortes direkt zurückgibt?
Vielen Dank.
Antworten:
Bash führt die Wortaufteilung in Zeichenfolgen von selbst durch - in der Tat meistens, um dies zu vermeiden, ist ein Problem, und der Grund für das Zitieren ist so wichtig. In Ihrem Fall ist es einfach, dies zu nutzen: Fügen Sie Ihren String einfach in ein Array ein, ohne ihn zu zitieren. Bash verwendet die Wortaufteilung, um die einzelnen Elemente zu trennen. Angenommen, Ihre Zeichenfolge ist in der Variablen gespeichert
$str
.gibt ein Array von 5 Elementen zurück. Ihr Array-Index ist Ihr Wortindex (von 0 bis hoch, wie in den meisten Skript- und Programmiersprachen), dh auf "Alter" wird mit zugegriffen
oder, wenn Sie den Elementindex nach Inhalt suchen müssen, durchlaufen Sie das Array, d. h
quelle
Ersetzen Sie * Alter durch Alter - dies entfernt alles vor "Alter":
Holen Sie sich alles vor "Alter"
Ermitteln Sie die Länge dieser Zeichenfolge (dies ist der Index für "Alter"):
quelle
export L='debug info warn error'; export GTE='warn'; echo ${L/*${GTE}/${GTE}}
Gibt 'warn error' ausWenn Sie bash nicht unbedingt verwenden müssen, sondern andere Programme verwenden können, die üblicherweise auf Systemen mit bash zu finden sind, können Sie Folgendes verwenden:
Python startet die String-Indizierung bei Null, daher habe ich am Ende des Befehls +1 hinzugefügt.
quelle
Sie können den nativen regulären Ausdruck von bash verwenden
Ausgabe
quelle
Hinweis : Angenommen, Sie möchten mit Index wissen, um welches Wort es sich handelt (ab 0) und nicht um welches Zeichen in der Zeichenfolge, mit dem das Wort beginnt. Andere Antworten sprechen letztere an.
Nicht dass ich es wüsste, aber du kannst eins machen. Zwei Tricks:
Code:
quelle
Versuchen Sie den folgenden Javascript-Oneliner in einer Shell (verwenden Sie die Javascript-Shell):
Oder mit einem Here-Doc:
quelle
Ich habe eine Lösung gefunden, die gut funktioniert.
Es funktioniert ähnlich wie die Funktion indexOf () in Java, die das erste Auftreten einer Eingabezeichenfolge zurückgibt.
Diese Lösung finden Sie hier http://www.linuxquestions.org/questions/linux-newbie-8/bash-string-manipulation-help-670627/ (letzter Beitrag). Dieser Typ hat mir den Tag gerettet. Gutschrift an ihn.
Schneller, wenn Sie Teilzeichenfolgen ab dem ersten Index ausführen möchten.
/programming/10349102/shell-script-substring-from-first-indexof-substring
quelle
Wenn Coreutils verfügbar sind, können Sie dies folgendermaßen tun:
Per MariusMatutiae-Anfrage füge ich eine Erklärung hinzu, wie diese 3-Schritte-Operation funktioniert:
Für Referenzen überprüfen Sie bitte:
http://www.tldp.org/LDP/abs/html/parameter-substitution.html (siehe: "Variable Erweiterung / Austausch von Teilzeichenfolgen")
http://www.gnu.org/software/coreutils/manual/coreutils .html (gehe zu: "Der Befehl cut" und "wc invocation"
quelle
Eine Mischung aus zwei zuvor gegebenen Antworten unter Verwendung von reinen Bash-Arrays und Teilstring-Ersatz.
Die Idee ist, eine Zeichenfolge aller Wörter vor dem gewünschten zu erhalten und dann die Anzahl der Wörter in dieser Teilzeichenfolge zu zählen, indem Sie sie zu einem Array machen.
Natürlich kann Age in einer anderen Variablen gespeichert
needle
und dann verwendet werden${haystack%$needle*}
. Erwarten Sie Probleme, wenn das gesuchte Wort eine Teilmenge eines anderen Wortes ist. In diesem Fall funktioniert die Antwort von kopischke immer noch.quelle