2010-03-24 9 views
1

J'ai une chaîne comme sample.txt.pgp et je veux retourner sample.txt dans un script shell (mais, la longueur de la chaîne variera, donc, fondamentalement, tous les caractères avant le ".pgp"). Y a-t-il une fonction substr? Comme, si je l'ai fait substr('sample.txt.pgp', -4, 0), est-ce censé retourner sample.txt? En ce moment ce n'est pas, alors je me demande si j'ai la syntaxe erronée, ou peut-être que substr n'est pas une fonction?Sous-chaîne Unix dans un script shell?

Répondre

2

Vous pouvez utiliser basename:

$ basename sample.txt.pgp .pgp 
sample.txt 

Utilisez des accents graves ou $() pour mettre le résultat dans une variable si vous voulez:

$ FILE=sample.txt.pgp 
$ VARIABLE=$(basename "$FILE" .pgp) 
$ echo $VARIABLE 
sample.txt 
+2

Intéressant que vous utilisiez la notation '-s suffixe'; cela n'est pas standardisé par POSIX; la notation classique serait '$ (basename $ file .pgp)' (en supposant que le nom soit conservé dans une variable '$ file'). –

+1

@Jonathan Oui en effet! J'ai juste fait un 'man basename' sur ma machine OS X ici, et j'ai vu l'option' -s'; c'était un peu plus flexible (peut gérer plus d'une chaîne), je ne savais pas que ce n'était pas POSIX. Je vais modifier ma réponse. –

+1

Modifié; J'ai également mis des guillemets doubles pour soutenir les espaces dans le nom de fichier. –

0

filename sample.txt.pgp renvoie sample.txt, je crois. (accents graves d'utilisation)

+0

Je ne pense pas J'ai vu cette commande installée sur n'importe lequel de mes systèmes ... – Cascabel

+1

@Jefromi: Je pense qu'ils font référence à 'basename'. –

+0

whoops, oui. basename – Cheeso

3
a='sample.txt.pgp' 
echo ${a%.*} # sample.txt (minimal match) 
echo ${a%%.*} # sample  (maximal match) 
+0

Cela semble intéressant ... Quel est le signe dollar et% représentent? Avez-vous une page qui explique cela ou quoi que ce soit? – TwixxyKit

+0

@KnockKnockWhosThere: Lisez http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02 pour plus d'informations. :-) –

+2

Et une version plus contrainte: '$ {a% .pgp}' supprime seulement une extension '.pgp' si elle est présente; l'original supprimera toute extension (ce qui peut être utile dans certains cas). –

Questions connexes