# [SCRIPT] faire un mv avec regex (résolu)

## Tony Clifton

Bonjour,

je souhaiterais remplacer la syntaxe de plusieurs répertoires. La syntaxe que j'utilise actuellement est du type :

```
champ1/champ2 - champ3 (champ4)
```

et je voudrais me retrouver avec cela :

```
champ1/champ2 - champ3 - champ4
```

Je pense donc que cette modification doit facilement être opérable en utilisant des REGEX. Cependant je n'y connait absoluement rien aux REGEX, mais cela m'intéresse fortement. Ce petit exercice pourrait donc être une bonne initiation.

Comment puis-je me débrouiller, dois-je faire un script en Perl ou du BASH suffit amplement… ?

----------

## netfab

Hello,

Avec awk :

```

$ echo 'champ1/champ2 - champ3 (champ4)' | awk '{print gensub(/(.+)\/(.+) - (.+) \((.+)\)/, "\\1/\\2 - \\3 - \\4", "g")}'

champ1/champ2 - champ3 - champ4

```

Te reste plus qu'à faire le mv.

----------

## Enlight

Y'a rename pour ces choses là, non?

----------

## Poussin

Je vais ptete dire une connerie, mais le rename qui permet ces choses là est le rename posix, non dispo dans portage. Mais renamexm fonctionne (mais le nom du paquet, c'est sys-apps/rename) 

enfin voilà ^^

----------

## Tony Clifton

 *netfab wrote:*   

> Hello,
> 
> Avec awk :
> 
> ```
> ...

 

MERCI !

Alala, awk… que deviendrait-on sans ?

Il faudrait juste que je sache faire autre chose que '{ print $1 }' et compagnie.

Pourtant le manuel est très clair :

 *man wrote:*   

> gensub(r, s, h [, t])   Search the target string t for matches of the regular expression r.  If h is a string beginning with g or G, then replace all matches of r with  s.
> 
> Otherwise,  h  is  a  number indicating which match of r to replace.  If t is not supplied, $0 is used instead.  Within the replacement text s, the
> 
> sequence \n, where n is a digit from 1 to 9, may be used to indicate just the text that matched the n'th parenthesized subexpression.  The sequence
> ...

 

----------

## truc

ipop, puisque tu sembles vouloir découvrir, j'en profite pour t'introduire une manière de le faire en sh

```
for file in rep1/* rep2/* ; do

new="${file%(*}"

[ "$new" = "$file" ] && continue

tail="${file##*(}"

tail="${tail%)}"

new="${new}- $tail"

echo "mv -v -- \"$file\" \"$new\""

done
```

----------

## Tony Clifton

 *truc wrote:*   

> ipop, puisque tu sembles vouloir découvrir, j'en profite pour t'introduire une manière de le faire en sh
> 
> ```
> for file in rep1/* rep2/* ; do
> 
> ...

 

Merci, ça me permet de me perfectionner en shell  :Wink: .

Cependant je crois qu'il y a une erreur   :Cool:  :

```
tail="${file##*'('}
```

au lieu de

```
tail="${file##*(}"
```

Mais je ne saurais pas expliquer pourquoi ça marche dans le « new="${file%(*}" » mais pas là.

----------

## truc

```
file="adfaf (asdf)"

echo "${file##*(}" 

asdf)
```

Je ne semble pas avoir d'erreur de mon côté, c'est bizarre  :Question: 

----------

## Tony Clifton

Ah curieux, j'viens de faire un test :

```
pa@pag-port ~ $ file="adfaf (asdf)"

pa@pag-port ~ $ echo "${file##*(}"

adfaf (asdf)

pa@pag-port ~ $ /bin/bash

pa@pag-port ~ $ file="adfaf (asdf)"

pa@pag-port ~ $ echo "${file##*(}"

asdf)
```

----------

## Poussin

ou alors tu mets tout ça dans un fichier bash ...

----------

## truc

space! bash est ton shell par défaut pourtant? (j'entends par là, le shell dans lequel tu as fait le test qui à échoué?

Des paramètres particulier ou que sais-je encore?

Le test fonctionne bien avec dash qui se veut posix, j'aurai donc envie de dire que ça devrait fonctionner! Mais, je loupe peut-être quelque chose?

----------

