2017-02-03 2 views
0

Ich möchte den Basisnamen einer Variablen, die immer eine Datei mit einer Erweiterung sein wird, mit der gestrippten Erweiterung erhalten und als eine Variable festlegen.Basisname und Erweiterung entfernt

Zum Beispiel, wenn $ foo /$HOME/Desktop/doc.txt ist, dann möchte ich die Variable $ Mediaid "doc"

mediaid=$(basename $foo | cut -d. -f1) arbeitet

aber

mediaid="$(${foo##*/} | cut -d. -f1)" sein tut nicht

Ich bekomme meine Zitate/Klammern/$ durcheinander, aber ich bin mir nicht sicher, wo oder wie genau.

Gibt es auch eine mehr, um, elegante Art, dies zu schreiben, die es vermeidet, es an cut zu leiten?

+0

Kennen Sie die Erweiterung? – user2182349

+0

Bitte zeigen Sie Beispielstrings und gewünschte Ergebnisse an. –

+1

@CasimiretHippolyte ok. Ich fügte diese in. – Bleakley

Antwort

2

eine Erweiterung verwenden, die Muster entfernt:

basename="${foo##*/}" 
basename_stripped="${basename%.*}" 

Die % führt also zur Entfernung des kürzesten Spiels, von dem Ende des Wertes foo Starten des folgenden Musters. .* ist ein Globbing-Muster und entspricht einem wörtlichen Punkt, dem alles folgt.

Die ## bewirkt das Entfernen der längsten Übereinstimmung des folgenden Musters, beginnend mit dem Anfang, und */ entspricht alles bis zum letzten Pfadtrennzeichen.

Eine Erweiterung wird von der Shell ausgeführt, ohne externen Befehl oder Subshell, also wird es viel schneller.

+0

ja, aber das entfernt nur die Erweiterung und hilft auch nicht beim Abrufen des Basisnamens der Datei, die ich brauche. – Bleakley

+0

@Bleakley Siehe aktualisierte Antwort. – Fred

+0

Kühl. Gibt es eine Möglichkeit, das zu kombinieren, so dass ich nicht zwei verschiedene Variablen festlegen muss? – Bleakley

Verwandte Themen