Wie schneide ich alle Zeichen nach dem letzten '/'?
Dieser Text
xxxx/x/xx/xx/xxxx/x/yyyyy
xxx/xxxx/xxxxx/yyy
sollte zurückkehren
xxxx/x/xx/xx/xxxx/x
xxx/xxxx/xxxxx
command-line
text-processing
Josef Klimuk
quelle
quelle
basename
unddirname
mach das schon./
schneiden" wurde zu "Wie schneide ich alle Zeichen nach dem letzten '/'?" Das ist eine Änderung der Formulierung, die die Bedeutung vernünftigerweise beibehält, IMO. Wenn überhaupt, fühlte ich den Teil "weglassen, was ist ..." mehrdeutig: Die Beispiele scheinen zu behalten, was vor dem ist/
. Das Beispiel macht es trotzdem klar.Antworten:
Wenn Sie das "geschnittene Teil" erhalten möchten
Sie können verwenden
z.B.
Ausgabe
(Hinweis: Hierbei wird die Fähigkeit von sed verwendet, im Befehl s ein anderes Trennzeichen als /, in diesem Fall |, zu verwenden.)
Wenn Sie den Anfang der Zeichenfolge erhalten möchten:
Sie können verwenden
z.B.
Ausgabe
quelle
#
anstelle von ändern/
. Sie können die Option auch verwenden,-r
wenn Sie nicht jedem Sonderzeichen entkommen möchten :sed -r 's#(^.*)/.*$#\1#'
.Wenn Sie schneiden aus den Enden der Saiten,
dirname
könnte die Rechnung passen:Wenn Sie versuchen, den letzten Teil der Zeichenfolge zu isolieren, verwenden Sie
echo /$(basename "$str")
.quelle
dirname
undbasename
ist nicht allgemein bekannt, abersed
undawk
sind.cat text | basename
nicht. Also eine richtige Lösung für OPs Frage mitdirname
undbasename
würde beinhaltenxargs
usw.Parametererweiterung in
bash
bash
In diesem Fall können Sie die Parametererweiterung in verwenden${parameter%word}
woword
ist/*
${parameter##word}
woword
ist*/
Beispiele:
Entfernen Sie den letzten Teil
Dies ist beschrieben in
man bash
:Entfernen Sie alle außer dem letzten Teil
Sie können einen Schrägstrich wie diesen hinzufügen
um genau das zu bekommen, was Sie an einer bestimmten Instanz gemäß der bearbeiteten Frage wollten. Aber die Frage wurde danach von mehreren Personen bearbeitet und es ist nicht einfach zu wissen, was Sie jetzt wollen.
Dies ist beschrieben in
man bash
:quelle
Eine andere Möglichkeit besteht darin
grep
, nur den letzten Schrägstrich pro Zeile anzuzeigen und was auch immer darauf folgt:Erläuterung:
-o
weistgrep
an, nur den passenden Teil der Zeile anstelle der gesamten Zeile anzuzeigen.Das Muster
/[^/]*$
entspricht einem wörtlichen Schrägstrich,/
gefolgt von einem beliebigen Zeichen, mit Ausnahme eines Schrägstrichs,[^/]
der*
bis zum Ende der Zeile beliebig oft verwendet wird$
.quelle
Nur weil andere "vernünftigere" Antworten gepostet haben, ist hier eine etwas dumme:
rev
kehrt die Zeichen in jeder Zeile um, zBabcd/ef/g
wirdg/fe/dcba
. Danncut
schneidet das erste Segment aus. Endlich ist es wieder umgekehrt.quelle
Klassische Lösung mit
awk
, die/
sowohl für die Eingabe als auch für die Ausgabe als Feldtrennzeichen behandelt und das letzte Feld auf eine leere Zeichenfolge setzt (was wirklich eine "Dereferenzierung" der Anzahl derNF
variablen Felder bedeutet ):Kürzer, wie Fedorqui in den Kommentaren betonte :
Eine Variation davon wäre, den Pfad in
awk
die Ausführungsumgebung einzufügen, was die Installation spart, aber denawk
Teil ausführlicher macht:quelle
NF--
? Auf diese Weise können Sie dasprint
bla bla erkennen.Hinzufügen zu Egmonts Antwort, da die Frage bearbeitet wurde ...
Verwenden Sie --complement, wenn Sie das erste Feld mit -f1 entfernen möchten .
Außerdem ist die Frage nicht ganz klar, was mit Eingaben geschehen soll, die keine Schrägstriche enthalten. xxxx => xxxx oder xxxx => nichts
quelle
--complement
Option vorher nicht bemerkt und die Manpage ist kreisförmig. Komplement bedeutet Komplement. Ich habe ein schönes Schnitt-Tutorial gefunden, das es unter yourownlinux.com/2015/05/ behandelt. Es ist wie-v
ingrep
. Gib mir alles außer dem, was zusammen passt.-f2-
ist eine einfachere Form für-f1 --complement
.