Ich verwende curl
und cut
für eine Ausgabe wie unten.
Variible var
erhält zwei Arten von Werten (jeweils einzeln).
Ich versuche tatsächlich alles bis zum letzten "-" zu bekommen. d. h. HIX-MAIN
oder HIX-R1-1
.
Der angezeigte Befehl funktioniert einwandfrei, um HIX-R1-1
zu erhalten.
Aber ich habe mir gedacht, dass dies der falsche Weg ist, wenn ich etwas so etwas wie nur 1 -
in der Variable habe; es bringt mir den gesamten Variablenwert (z.B. HIX_MAIN-7ae526629f6939f717165c526dad3b7f0819d85b
).
Wie gehe ich vor, um alles bis zum letzten '-' in die Variable var
?
Dies entfernt alles vom letzten -
bis zum Ende:
Als Beispiele:
%Vor% Der Befehl sed substitute hat die Form s/old/new/
wobei old
ein regulärer Ausdruck ist. In diesem Fall lautet die Regex \(.*\)-.*
. Das funktioniert, weil \(.*\)-
gierig ist: Es wird alles bis zum letzten -
übereinstimmen. Wegen der geflohenen Parens, \(...\)
, wird alles vor dem letzten -
in Gruppe 1 gespeichert, was wir als bezeichnen können. Das letzte
.*
stimmt mit allem nach dem letzten -
überein. Solange also die Zeile ein -
enthält, stimmt diese Regex mit der gesamten Zeile überein und der Ersatzbefehl ersetzt die gesamte Zeile durch .
Sie können Bash-String-Manipulation verwenden:
%Vor% Die Operatoren #
und %
befinden sich auf einer QWERTY-Tastatur auf beiden Seiten von $
. Dadurch können Sie sich daran erinnern, wie sie die Variable ändern:
#pattern
schneidet das kürzeste Präfix ab, das mit "pattern" übereinstimmt. ##pattern
schneidet das längste Präfix ab, das mit "pattern" übereinstimmt. %pattern
schneidet das kürzeste Suffix ab, das mit "pattern" übereinstimmt. %%pattern
schneidet das längste Suffix ab, das mit "pattern" übereinstimmt. Dabei entspricht pattern
den Bash-Pattern-Matching-Regeln , einschließlich ?
(ein Zeichen) und *
(null oder mehr Zeichen).
Hier schneiden wir das kürzeste Suffix ab, das dem Muster -*
entspricht, also wird ${foo%-*}
Ihnen das bringen, was Sie wollen.
Natürlich gibt es viele Möglichkeiten, dies mit awk
oder sed
zu tun, möglicherweise unter Verwendung des sed
Befehls, den Sie bereits ausführen. Variable Manipulation kann jedoch nativ in bash durchgeführt werden, ohne einen anderen Prozess zu starten.
Ich denke, du solltest sed
verwenden, zumindest nach dem tr
:
-n
bedeutet "nicht standardmäßig drucken". Der /-/
sucht nach einer Zeile mit einem Bindestrich. Es führt dann s/-[^-]*$//
aus, um den letzten Gedankenstrich und alles danach zu löschen, gefolgt von p
zum Drucken und q
zum Beenden (so dass nur die erste Zeile gedruckt wird).
Ich nehme an, dass die Ausgabe von curl
intrinsisch mehrere Zeilen enthält, von denen einige unerwünschte doppelte Anführungszeichen enthalten, und dass nur die erste Zeile mit einem Bindestrich übereinstimmen muss (was sehr gut möglich ist) nicht die erste Zeile sein). Sobald Sie die Eingabe auf die einzige interessante Zeile reduziert haben, können Sie reine Shell-Techniken verwenden, um das gewünschte Ergebnis zu erzielen. Die einzige interessante Zeile zu erhalten ist jedoch nicht so trivial wie einige der Antworten vermuten.