Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

renommer un fichier sans les espaces

8 réponses
Avatar
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)

8 réponses

Avatar
Alain Ketterlin
Hugolino writes:

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.

Avatar
Matthieu Moy
Alain Ketterlin writes:

Hugolino writes:

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


Avatar
Stephane Chazelas
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

Avatar
Hugolino
Le Wed, 10 Oct 2007 20:32:48 +0200, Alain Ketterlin a écrit:
Hugolino writes:

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.


Avatar
Olivier Miakinen

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 ».


Avatar
Hugolino
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 -+-



Avatar
Thierry B.
--{ 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 -+-




Avatar
bull.titan
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