2009-03-12 9 views
3

J'ai un chemin comme une chaîne dans un script shell, pourrait être absolue ou relative:Quelle est la meilleure façon d'effectuer une manipulation de chaîne dans un script shell?

/usr/userName/config.cfg

ou

../config.cfg

Je veux extraire le nom de fichier (partie après la dernière /, donc dans ce cas: "config.cfg")

Je trouve la meilleure façon de le faire avec une simple regex? Est-ce correct? Devrais-je ou devrais-je utiliser sed ou awk à la place?

Les fonctionnalités de manipulation de chaînes de Shell-scripting semblent assez primitives par elles-mêmes, et semblent très ésotériques.

Des exemples de solutions sont également appréciés.

Répondre

6

Au lieu de la manipulation de chaînes que je venais d'utiliser

file=`basename "$filename"` 

Modifier:

Merci pour se détendre pour une nouvelle syntaxe pour cela (ce qui suppose que votre nom est maintenu en $ filename):

file=$(basename $filename) 
+0

+1, mais je vous recommande de la nouvelle syntaxe: « file = $ (basename $ filename) "en supposant que $ filename contient le nom d'entrée. – unwind

+0

@unwind. Merci pour cela, je n'étais pas au courant de cette syntaxe. Est-il juste préféré maintenant (mais essentiellement le même) ou est-il plus rapide? – RobS

+0

Je pense que c'est préférable comme étant plus lisible, mais c'est tout –

1

La plupart des environnements ont accès à perl et je suis plus à l'aise avec ça pour la plupart des manipulations de chaînes.

Mais comme mentionné, quelque chose de si simple, vous pouvez utiliser basename.

11

Si vous êtes d'accord avec l'aide bash, vous pouvez utiliser des extensions de chaîne bash:

FILE="/path/to/file.example" 
FILE_BASENAME="${FILE##*/}" 

Il est un peu cryptique, mais les accolades commencer l'extension variable et la double hachage fait une suppression gourmande du motif glob spécifié depuis le début de la chaîne. Double %% fait la même chose à la fin d'une chaîne, et un seul pourcentage ou hachage effectue une suppression non gourmande.

En outre, un simple remplacement de construction est également disponible:

FILE=${FILE// /_} 

remplacerait tous les espaces par des underscores par exemple.

Une seule barre oblique à nouveau est non gourmande.

+2

+1. cette solution est beaucoup plus rapide que l'exécution de la commande externe, mais comme les armes à feu mentionnées, vous devriez utiliser '#!/bin/bash' dans ce cas. –

+1

+1 pour éviter la fourchette inutile de 'basename'. – Jens

+2

+1 Merci pour l'explication des gars cupides Double Hash/Double Percent et de leur single Hash/Percent non gourmand. C'est bon. – javadba

1

J'utilise généralement sed avec une expression régulière simple, comme ceci:

echo "/usr/userName/config.cfg" | sed -e 's+^.*/++' 

Résultat:

>echo "/usr/userName/config.cfg" | sed -e 's+^.*/++' 
config.cfg 
Questions connexes