Forum Linux.général sed : cas complexe

Posté par  .
Étiquettes : aucune
0
3
avr.
2005
Ne discutons pas de l'optimisation de ce script SVP, il ne tournera qu'une fois sur ma machine, et pour quelques centaines de fichiers.

find [...] | while read file; do mv "$file" "`echo $file|sed s/a/b/g`" ; done

Si quelqu'un a la moindre idée de ce qu'il faut mettre en a et b pour remplacer chaque guillemet double par deux guillemets simples (`Je dis "salut"` devient `Je dis ''Salut''`), qu'il me fasse signe ;)

J'ai mis un `echo` devant le `mv` et fait plein de tests, mais rien à faire, je n'y arrive pas !
  • # Réponse

    Posté par  . Évalué à 3.

    Merci encore à TeXitoi, de #debian-fr@freenode, pour la réponse :
    find . "*\"*" -exec rename "s/\"/''/g" {} \;
    • [^] # Re: Réponse

      Posté par  . Évalué à 3.

      Chacun aura compris qu'il fallait ajouter -name entre . et "*\"*". La ligne fonctionne même si on ne la corrige pas (find traitera tous les fichiers, mais seuls seront déplacés ceux qui contiennent des guillemets doubles).

      J'ajoute que '*"*' était plus simple que "*\"*", mais c'est sans grande importance.

      Il est aussi intéressant de préciser que si un dossier le nom comporte des guillemets doubles et qu'il contient des fichiers dont les noms comportent des guillemets doubles, au lancement de "script", le dossier sera renommé et les fichiers ne seront pas déplacés, leur nom ayant changé. Il suffit de relancer. Pour 3 niveaux de profondeurs incluant des guillemets, 3 lancements, etc.
  • # Voili :

    Posté par  . Évalué à 3.

    find [...] | while read file; do nouv=`echo $file | sed s/\"/\'\'/g`; mv "$file" "$nouv" ; done
  • # ma solution a moi

    Posté par  (site web personnel) . Évalué à 3.

    Voila avec ca normalement pas besoin de multipassage si les repertoires contiennent des "
    #!/bin/bash
    
    IFS=$'\n'
    
    for fich in `ls $1`
    do
      if [ -d $fich ]
      then
        $0 "$1/$fich"
      fi
        newfich=`echo "$fich" | sed s/\"/\'\'/g`
      if [ "$newfich" != "$fich" ]
      then
        #mv "$1\$fich" "$1\$newfich"
        echo "$1\$newfich"
      fi
    done
    A utiliser genre
    #/home/moi/mymv.sh /

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.