Wie bis zum letzten Auftreten eines Charakters in der Bash-Shell

7

Ich verwende curl und cut für eine Ausgabe wie unten.

%Vor%

Variible var erhält zwei Arten von Werten (jeweils einzeln).

%Vor%

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 ?

zu bekommen     
Monica T 19.08.2015, 00:12
quelle

4 Antworten

10

Dies entfernt alles vom letzten - bis zum Ende:

%Vor%

Als Beispiele:

%Vor%

Wie es funktioniert

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 .

    
John1024 19.08.2015, 00:18
quelle
8

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.

    
Jeff Bowman 19.08.2015 00:20
quelle
2

Sie können die Zeichenfolge mit rev , cut aus dem zweiten Feld und dann wieder rev umkehren:

%Vor%

Für HIX-R1-1----3b5126629f67892110165c524gbc5d5g1808c9b5 , druckt:

%Vor%     
higuaro 19.08.2015 00:16
quelle
2

Ich denke, du solltest sed verwenden, zumindest nach dem tr :

%Vor%

-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.

>     
Jonathan Leffler 19.08.2015 00:20
quelle

Tags und Links