it-swarm.com.de

Ausschneiden aller Zeichen nach dem letzten /

Wie schneide ich alle Zeichen nach dem letzten '/' aus?

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
8
Josef Klimuk

Wenn Sie das "geschnittene Teil" bekommen wollen

yyy
yyyyy

Sie können verwenden

sed 's|.*/||' 

z.B.

echo "xxx/xxxx/xxxxx/yyy" | sed 's|.*/||'
echo "xxxx/x/xx/xx/xxxx/x/yyyyy" | sed 's|.*\/||'

ausgabe

yyy
yyyyy

(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:

xxx/xxxx/xxxxx
xxxx/x/xx/xx/xxxx/x

Sie können verwenden

sed 's|\(.*\)/.*|\1|'

z.B.

echo "xxx/xxxx/xxxxx/yyy" | sed 's|\(.*\)/.*|\1|'
echo "xxxx/x/xx/xx/xxxx/x/yyyyy" | sed 's|\(.*\)/.*|\1|'

ausgabe

xxx/xxxx/xxxxx
xxxx/x/xx/xx/xxxx/x
10
Félicien

Wenn Sie aus die Enden der Zeichenfolgen abschneiden, passt dirname möglicherweise zur Rechnung:

$ dirname xxxx/x/xx/xx/xxxx/x/yyyyy
xxxx/x/xx/xx/xxxx/x
$ _

Wenn Sie versuchen, den letzten Teil der Zeichenfolge zu isolieren, verwenden Sie echo /$(basename "$str").

$ str=xxxx/x/xx/xx/xxxx/x/yyyyy
$ echo /$(basename "$str")
/yyyyy
$ _
18
dsstorefile1

Parametererweiterung in bash

In diesem Fall können Sie die Parametererweiterung in bash verwenden

  • ${parameter%Word} wobei Word/* ist
  • ${parameter##Word} wobei Word*/ ist

Beispiele:

Entfernen Sie den letzten Teil

$ asdf="xxx/xxxx/xxxxx/yyy"
$ echo ${asdf%/*}
xxx/xxxx/xxxxx

Dies ist in man bash beschrieben:

${parameter%Word}
${parameter%%Word}
      Remove matching suffix pattern.  The Word is expanded to produce
      a pattern just as in pathname expansion.  If the pattern matches
      a  trailing portion of the expanded value of parameter, then the
      result of the expansion is the expanded value of parameter  with
      the  shortest  matching  pattern (the ``%'' case) or the longest
      matching pattern (the ``%%'' case) deleted.  If parameter  is  @
      or  *,  the  pattern  removal operation is applied to each posi‐
      tional parameter in turn, and the  expansion  is  the  resultant
      list.   If  parameter is an array variable subscripted with @ or
      *, the pattern removal operation is applied to  each  member  of
      the array in turn, and the expansion is the resultant list.

Alle bis auf den letzten Teil entfernen

$ asdf="xxx/xxxx/xxxxx/yyy"
$ echo ${asdf##*/}
yyy

Sie können einen Schrägstrich wie folgt einfügen

$ echo /${asdf##*/}
/yyy

um genau das zu bekommen, was Sie in 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 in man bash beschrieben:

${parameter#Word}
${parameter##Word}
      Remove matching prefix pattern.  The Word is expanded to produce
      a pattern just as in pathname expansion.  If the pattern matches
      the  beginning of the value of parameter, then the result of the
      expansion is the expanded value of parameter with  the  shortest
      matching  pattern  (the ``#'' case) or the longest matching pat‐
      tern (the ``##'' case) deleted.  If parameter is  @  or  *,  the
      pattern  removal operation is applied to each positional parame‐
      ter in turn, and the expansion is the resultant list.  If param‐
      eter  is  an array variable subscripted with @ or *, the pattern
      removal operation is applied to each  member  of  the  array  in
      turn, and the expansion is the resultant list.
15
sudodus

Eine andere Möglichkeit besteht darin, grep zu verwenden, um nur den letzten Schrägstrich pro Zeile und den darauf folgenden anzuzeigen:

$ grep -o '/[^/]*$' example.txt
/yyy
/yyyyy

Erläuterung:

-o weist grep 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 [^/] beliebig oft * bis zum Ende der Zeile $.

9
Byte Commander

Nur weil andere "vernünftigere" Antworten gepostet haben, ist dies etwas albern:

rev | cut -d/ -f1 | rev

rev kehrt die Zeichen in jeder Zeile um, z. abcd/ef/g wird g/fe/dcba. Dann schneidet cut das erste Segment aus. Endlich ist es wieder umgekehrt.

7
egmont

Klassische Lösung mit awk, die / als Feldtrennzeichen für Ein- und Ausgabe behandelt und das letzte Feld auf leere Zeichenfolge setzt (was wirklich "dereferenziert" von der Anzahl der Felder NF Variable ist) ):

$ echo "xxx/xxxx/xxxxx/yyy"|awk  'BEGIN{OFS=FS="/"};{$NF="";print $0}'
xxx/xxxx/xxxxx/

Kürzere, wie fedorqui in den Kommentaren ausgeführt:

$ echo "xxx/xxxx/xxxxx/yyy"|awk  'BEGIN{OFS=FS="/"};NF--'
xxx/xxxx/xxxxx/

Eine Variation davon wäre, den Pfad in die Ausführungsumgebung von awk einzufügen, wodurch zwar weniger Installationsaufwand anfällt, der Abschnitt awk jedoch ausführlicher wird:

mypath="xxx/xxxx/xxxxx/yyy" awk  'BEGIN{OFS=FS="/"; sub(/\/([^\/]*)$/,"",ENVIRON["mypath"]);print(ENVIRON["mypath"]) };'
3

Hinzufügen zu egmonts Antwort, da die Frage bearbeitet wurde ...

Verwenden Sie - Komplement, wenn Sie das erste Feld mit - f1 entfernen möchten.

echo "xxxx/x/xx/xx/xxxx/x/yyyyy"|rev|cut -d/ -f1 --complement|rev
xxxx/x/xx/xx/xxxx/x

echo "xxxx/x/xx/xx/xxxx/x/yyyyy"|rev|cut -d/ -f1|rev
yyyyy

Außerdem ist die Frage nicht ganz klar, was mit Eingaben geschehen soll, die keine Schrägstriche enthalten. xxxx => xxxx oder xxxx => nichts

2
Ph3n0x