renommer un fichier sans les espaces

Le
Hugolino
Bonjour,

J'ai écrit un script qui permet de remplacer le premier espace qui se
trouve dans un nom de fichier, à l'aide de la ligne:

File_Dest=`echo "${File_Orig}" | sed -e 's/ /_/'`

Alors que ce que je voudrais, c'est remplacer *tous* les espaces
présents dans ce nom de fichier par un seul '_' si les espaces sont
consécutifs.

Qu'aie-je loupé ?
Je vous épargne mes nombreux et vains essais de regexp tous plus foireux
les uns que les autres :((


Le script est là <http://roulaize.fr/scripts_bash/StripSpaces>.
Si vous avez le temps d'y jeter un coup d'oeil, j'aimerais que vous me
disiez ce que vous pensez de:

for file in `find . -maxdepth 1 -type f -name '* *'| cut -b3-`

car cut est le seul moyen que j'ai trouvé pour enlever le './' devant le
nom de fichier renvoyé par find, et j'aime pas trop

Question subsidiaire: Comment permettre à l'utilisateur de choisir le
caractère de substitution ?
La ligne
File_Dest=`echo "${File_Orig}" | sed -e 's/ /${Chaine_de_remplacement}/'`
ne marche pas (${Chaine_de_remplacement} n'est pas interprété)

PS: Aie-je raison de croire qu'il n'est pas nécessaire de restaurer
l'IFS à $OLD_IFS ?

Toute critique/correction acceptée avec respect.


Merci de votre aide.

--
Multi-taches, comme Windows et Woolite, ou multitâches, comme Unix ?
Hugo (né il y a 1 371 473 222 secondes)
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Alain Ketterlin
Le #774479
Hugolino
File_Dest=`echo "${File_Orig}" | sed -e 's/ /_/'`


sed -e 's/ */_/g'

(il y a deux blancs avant l'étoile, et c'est le g qui fait le
remplacement multiple.)

Question subsidiaire: Comment permettre à l'utilisateur de choisir le
caractère de substitution ?


sed -e "s/ */$SEPARATEUR/g"

attention à la valeur de SEPARATEUR quand même

for file in `find . -maxdepth 1 -type f -name '* *'| cut -b3-`


sed -e 's@^./@@'

(mais je ne vois pas l'intérêt)

-- Alain.

Matthieu Moy
Le #774476
Alain Ketterlin
Hugolino
File_Dest=`echo "${File_Orig}" | sed -e 's/ /_/'`


sed -e 's/ */_/g'

(il y a deux blancs avant l'étoile, et c'est le g qui fait le
remplacement multiple.)


A notter que tout ça se fait avec

$ rename 's/ +/_/g' *

Avec le « rename » fourni avec perl.

--
Matthieu


Stephane Chazelas
Le #774473
2007-10-10, 19:52(+02), Hugolino:

Bonjour,

J'ai écrit un script qui permet de remplacer le premier espace qui se
trouve dans un nom de fichier, à l'aide de la ligne:

File_Dest=`echo "${File_Orig}" | sed -e 's/ /_/'`
[...]


Avec zsh:

autoload -U zmv # in ~/.zshrc
zmv '* *' '${f// ##/_}

Ou recursivement:

zmv '(**/)(* *)' '$1${2// ##/_}'

Sinon, avec sed,

ca serait plutot: printf '%sn' "$File_Orig" | sed 's/ {1,}/_/g'

Mais ca laisse quand meme tout un tas to problemes potentiels
que resoud le zmv de zsh.

--
Stéphane

Hugolino
Le #774470
Le Wed, 10 Oct 2007 20:32:48 +0200, Alain Ketterlin a écrit:
Hugolino
File_Dest=`echo "${File_Orig}" | sed -e 's/ /_/'`


sed -e 's/ */_/g'


OK pour le g que j'avais omis.

(il y a deux blancs avant l'étoile, et c'est le g qui fait le
remplacement multiple.)


Je ne comprends pas comment ton _double_ espace peut matcher sur un nom
de fichier avec _un_ seul espace.

Question subsidiaire: Comment permettre à l'utilisateur de choisir le
caractère de substitution ?


sed -e "s/ */$SEPARATEUR/g"

attention à la valeur de SEPARATEUR quand même


Bof, maintenant que je sais "stripper" les cochoncetés :)

for file in `find . -maxdepth 1 -type f -name '* *'| cut -b3-`


sed -e 's@^./@@'

(mais je ne vois pas l'intérêt)


Parce que je croyais que je n'aariverais pas à faire de lien de
"./toto titi" vers StripSlashed/./toto_titi", mais ça marche.

Merci à toi et aux autres contributeurs.


--
Con : personne qui n'est pas conne de la même manière que soi.


Olivier Miakinen
Le #774468

sed -e 's/ */_/g'
(il y a deux blancs avant l'étoile, et c'est le g qui fait le
remplacement multiple.)


Je ne comprends pas comment ton _double_ espace peut matcher sur un nom
de fichier avec _un_ seul espace.


Le deuxième espace est suivi du caractère * qui est un multiplicateur
« 0 fois ou plus ».


Hugolino
Le #774464
Le Thu, 11 Oct 2007 00:34:38 +0200, Olivier Miakinen a écrit:

sed -e 's/ */_/g'
(il y a deux blancs avant l'étoile, et c'est le g qui fait le
remplacement multiple.)


Je ne comprends pas comment ton _double_ espace peut matcher sur un
nom de fichier avec _un_ seul espace.


Le deuxième espace est suivi du caractère * qui est un multiplicateur
« 0 fois ou plus ».


La nuit portant conseil, c'est ce que j'avais fini par comprendre. (Si
ça se trouve, mes rèves sont hantés par des regexp :)

Merci

--
Je cherche une methode pour verifier si le port 515 est a l'ecoute.
Cette requete est a envoyer d'une station Solaris vers un serveur NT.
use Net::TCP; $object = new Net::TCP "playstation", 515;

$ok = $object->connect; -+- SB in Guide du linuxien pervers -+-



Thierry B.
Le #774243
--{ Hugolino a plopé ceci: }--

Le deuxième espace est suivi du caractère * qui est un multiplicateur
« 0 fois ou plus ».


La nuit portant conseil, c'est ce que j'avais fini par comprendre. (Si
ça se trouve, mes rèves sont hantés par des regexp :)


Ouch, ça c'est une crise de naxorisme avancé. Il faut absolument
soigner ça de suite. Passez donc à mon cabinet, je vais vous faire
une ordonnance...

Signé: le GdM autoproclamé.

--
Bah, oui, ça les occupe, genre bac-à-sable...
Ah mince, voilà que je me parle à moi-même ?

Fait gaffe, ça s'est vu, yen a qui ont remarqué.

-+- TB in GFA : le tonton s'autoquotera 3 fois -+-




bull.titan
Le #776564
1) il faut rajouter un "g" la fin de ton expression sed (signifiant
"toutes les occurences trouvées" et pas seulement une seule)

2) il faut mettre ta variable entre "' pour qu'elle soit interpretée
Publicité
Poster une réponse
Anonyme