drucke alles nach einem Schrägstrich

8

Ich habe herausgefunden, wie man alles vor einem Schrägstrich druckt, aber ich muss alles nach einem Schrägstrich drucken. Ich habe eine Zeichenfolge wie blablabal/importantund muss nur drucken important. Wie soll ich die folgende Zeile ändern, um alles nach einem Schrägstrich und nicht vorher zu drucken?

sed 's:/[^/]*$::'
Iris Pader
quelle
Sie müssen alles nach dem ersten Schrägstrich oder alles nach dem letzten Schrägstrich drucken?
Kira
@Kira Sieht aus wie der letzte Schrägstrich für mich $in der Regex.
Sly
Ich habe nur eine Spalte in einer Testdatei. Jede Zeile ist eine Zeichenfolge, bei der ein Schrägstrich nur einmal angezeigt wird.
Iris Pader
5
Verwenden Sie das richtige Werkzeug für diesen Job:cut -d/ -f2- <infile
don_crissti
@don_crissti Gibt es einen Grund, der cutbesser ist als seddafür?
Michael Hoffmann

Antworten:

13

Da Sie in Ihrem Kommentar erwähnt haben, dass die Datei nur einen Schrägstrich enthält, warum nicht einfach verwenden awk?

Beispiel:

 ❱ echo "blablabal/important" | awk -F'/' '{print $1}'
blablabal
 ❱ echo "blablabal/important" | awk -F'/' '{print $2}'
important
Schlau
quelle
Dadurch wird nur der zweite Teil in einer Zeichenfolge mit mehreren Schrägstrichen gedruckt. Nun, leider ist es das, was der Fragesteller will ...
Arthur2e5
Tatsächlich. Kein Grund, es mit einem sedErsatz zu komplizieren, wenn es nur zwei Ergebnisse gibt.
Sly
15

Löschen Sie einfach alles bis zum letzten Schrägstrich:

$ echo "blablabal/important" | sed 's:.*/::'
important

Es funktioniert auch mit mehreren Schrägstrichen:

$ echo "blablabal/not/ver/interesting/important" | sed 's:.*/::'
important
terdon
quelle
9

Es sieht so aus, als würden die anderen Antworten davon ausgehen, dass eine Datei mehrere Datenzeilen enthält, die alle verarbeitet werden sollen. In diesem Fall sedoder awk(oder möglicherweise cut) wäre dies das beste Werkzeug, um alle Zeilen auf einmal zu verarbeiten.

Wenn Sie jedoch nur eine Zeile in einer Shell-Variablen haben (vorausgesetzt, Sie verwenden bash), können Sie Shell-Erweiterungen verwenden, um das gewünschte Ergebnis zu erzielen, ohne Dienstprogramme in externen Prozessen erzeugen zu müssen:

$ var="interesting/bla/blablabal/important"
$ 
$ # everything after the first slash:
$ echo "${var#*/}"
bla/blablabal/important
$ # everything after the last slash:
$ echo "${var##*/}"
important
$ # everything before the first slash:
$ echo "${var%%/*}"
interesting
$ # everything before the last slash:
$ echo "${var%/*}"
interesting/bla/blablabal
$ 
Digitales Trauma
quelle
1

Das sollte funktionieren:

echo "blablabal/important" | sed 's:[^/]*/\(.*\):\1:'

Der erste Teil [^/]*entspricht allem, ABER einem Schrägstrich, dann haben wir einen wörtlichen Schrägstrich /und ein "passt zu allem" .*in der Klammer \(.*\). Die maskierten Klammern dienen dazu, das übereinstimmende Ergebnis zu "speichern", was bedeutet, dass es in diesem Fall alles nach dem ersten Schrägstrich enthält. Die \1beziehen sich auf die erste übereinstimmende Gruppe, in diesem Fall haben wir nur eine Gruppe, da es nur ein \(...\)Paar gibt.

In sedist das Zeichen, das Sie nach dem seingeben, das Trennzeichen. Es ist eine übliche Praxis, /als Trennzeichen zu verwenden, aber in diesem Fall ist es einfacher, etwas anderes zu verwenden, obwohl es auch möglich wäre, einen Schrägstrich zu verwenden.

Kira
quelle
Ja, es gibt 100 andere Möglichkeiten, dies zu tun. Ich denke, Terdons Antwort könnte die kürzeste sein sed. cutwäre auch eine gute Antwort für diesen speziellen Fall.
Kira
Ihr macht genau das Gegenteil - ihr bekommt den ersten, er bekommt alles.
Mikesserv
Das ist der Grund, warum ich OP gefragt habe, ob er nach dem ersten oder letzten Schrägstrich alles haben möchte, aber da es in seinem Fall nur einen Schrägstrich pro Zeile gibt, macht das keinen Unterschied.
Kira
1
sed -et -e's|/|&\n|;//D' <in >out

... druckt alles nach dem ersten Schrägstrich in eine Zeile, die einen enthält, oder druckt einen anderen unveränderten. Wenn Sie das ablegen //, werden nur die geänderten Zeilen gedruckt.

Abhängig von Ihrer Version müssen Sie möglicherweise eine wörtliche \nEwline anstelle nder \nEscape- Zeile verwenden sed.

Wenn Sie eine Anzahl von Vorkommen angeben ...

sed -et -e's|/|&\n|num;/\n/D'

... können Sie bis zum num- ten Schrägstrich in einer Zeile löschen, ohne eine Zeile zu beeinflussen, die nicht mindestens num- Schrägstriche enthält.

mikeserv
quelle