18 votes

supprimer l'extension d'un fichier sans le savoir

Je sais comment enlever l'extension d'un fichier, quand je le connais comme :

nameis=$(basename $dataset .csv)

mais je veux supprimer toute extension sans la connaître à l'avance, quelqu'un sait comment faire ?

Toute aide est appréciée, Ted

31voto

Mark Longair Points 93104

En bash, vous pouvez faire ce qui suit :

nameis=${dataset%.*}

... par exemple :

$ dataset=foo.txt
$ nameis=${dataset%.*}
$ echo $nameis
foo

Cette syntaxe est décrite dans la page de manuel de bash comme :

${paramètre%mot}

${paramètre%%mot}

Supprime le motif de suffixe correspondant. Le mot est développé pour produire un motif comme dans l'expansion de nom de chemin. Si le motif correspond à une partie arrière de la valeur développée du paramètre, le résultat de l'expansion est la valeur développée du paramètre avec le motif le plus court (le cas "%") ou le motif le plus long (le cas "%%") supprimé. Si le paramètre est @ ou *, l'opération de suppression de motif est appliquée à chaque paramètre positionnel tour à tour, et le développement est la liste résultante. Si le paramètre est une variable de tableau souscrite avec @ ou *, l'opération de suppression de motif est appliquée à chaque membre du tableau tour à tour, et le développement est la liste résultante.

5voto

user4853039 Points 51

Maintenant, si vous voulez du style old-school regexp :

echo "foo.bar.tar.gz" | sed "s/^\(.*\)\..*$/\1/"

-> Shall return : foo.bar.tar

I will break it down: 
s/   Substitute
^      From the beginning
\\(     Mark
.\*     Everything (greedy way)
\\)     Stop Marking (the string marked goes to buffer 1)
\\.     until a "." (which will be the last dot, because of the greedy selection)
.\*     select everything (this is the extension that will be discarded)
$      until the end
/    With (substitute)
\\1      The buffer 1 marked above (which is the filename before the last dot(.)
/    End

Cristiano Savino

2voto

larsmans Points 167484

Vous pouvez supprimer tout ce qui suit le dernier point, le cas échéant, avec sed :

nameis=$(echo $filename | sed 's/\.[^.]*$//')

Mais cela ne fonctionnerait pas sur les fichiers à double extension tels que .tar.gz .

1voto

geekosaur Points 26170

Quelque chose comme ${dataset%.*} pourrait fonctionner ; attention aux fichiers sans Les extensions, cependant, car il cherchera un point qui ne fait pas partie d'une extension à couper.

1voto

PCat Points 19

Nameis=${dataset%%.*} Suppose qu'aucun de vos noms de base ne contient de point. Cela renvoie la plus longue chaîne sans point possible à partir de la gauche.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X