Forum Programmation.shell disponibilité outil trim pour le shell

Posté par  (site web personnel) .
Étiquettes : aucune
-1
11
juil.
2011

Bonjour,
j'ai eu plusieurs fois besoin de supprimer des espaces en début et fin de fichier. Sur le web, on trouve des commandes à base de tr, plus ou moins complètes selon la page consultée.

Pour résoudre plus définitivement ce problème, je me suis écrit un script python (pour des raisons de lisibilité et de facilité) qui agit comme un filtre.

On obtient un comportement du type:
echo " a "|trim -> "a" sur la sortie standard

J'ai deux options pour supprimer uniquement à gauche ou uniquement à droite.

  • Est-ce que vous connaissez un vrai outil qui fait ça bien ? (Pas juste un bout de code à adapter.)
  • Si non, est-ce que vous pensez qu'il y a un intérêt à ce que je le publie ?
  • # sed

    Posté par  . Évalué à 3.

    La commande sed permet de résoudre ton problème.
    C'est performant et on trouve pas mal de documentation sur le net.

    Par exemple (non testé) :

    sed 's/^[[:space:]]*\(.*\)[[:space:]]*$//' <fichier> > <fichier de sortie>
    
    • [^] # plus court

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

      Il manque évidemment un backslash 1 [0] mais même avec ça, ta solution n'est pas correcte car * est gourmand et la gourmandise va de gauche à droite :

      $ echo "foo  " |   sed 's/^[[:space:]]*\(.*\)[[:space:]]*$/\1/' | hexdump -C
      00000000  66 6f 6f 20 20 0a                                 |foo  .|
      

      Donc une solution correcte en Perl :

      perl -pe's/^\s+//;s/\s+$//'
      

      Ou, si on veut utiliser la même approche (mais c'est plus long) :

      perl -pe's/^\s*(.*?)\s*$/$1/'
      

      man perlre

      Je suis curieux de voir la solution Python de srb.

      [0] https://linuxfr.org/suivi/impossible-de-mettre-des-backspaces-dans-les-commentaire-sans-user-de-subterfuges-abscons

      pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

      • [^] # Re: plus court

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

        J'avais écrit un script d'une cinquantaine de ligne pour gérer les paramètres en ligne de commande et qui utilisait les fonctions strip(), rstrip() ou lstrip() fournies en standard par Python.

        Merci à tous, ça me confirme dans l'idée qu'aucune solution qui s'est imposée. Je vais prendre les fonctions shell de Flyounet et les coller dans mon .bashrc, car elles répondent exactement à mon besoin.

  • # Sinon en mieux …

    Posté par  . Évalué à 0.

  • # En Bash ou Ksh

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

    Comme on a pas toujours tout d'installer sur une machine...

    Voici 3 petites fonctions à utiliser :

    ltrim() {
        __ltrim="${@}"
        while [ "x${__ltrim:0:1}" = "x " -o "x${__ltrim:0:1}" = "x  " -o "x${__ltrim:0:1}" = "x\n" -o "x${__ltrim:0:1}" = "x\r" -o "x${__ltrim:0:1}" = 'x
    ' ]; do
            __ltrim="${__ltrim:1}"
        done
        export __ltrim
        return ${TRUE}
    }
    
    rtrim() {
        __rtrim="${@}"
        while [ "x${__rtrim: -1}" = "x " -o "x${__rtrim: -1}" = "x  " -o "x${__rtrim: -1}" = "x\n" -o "x${__rtrim: -1}" = "x\r" -o "x${__rtrim: -1}" = 'x
    ' ]; do
            let __=${#__rtrim}-1
            __rtrim="${__rtrim:0:$__}"
        done
        export __rtrim
        return ${TRUE}
    }
    
    trim() {
        __trim="${@}"
        ltrim "${@}"
        rtrim "${__ltrim}"
        __trim="${__rtrim}"
        unset __ltrim
        unset __rtrim
        export __trim
        return ${TRUE}
    }
    

    Comme ça pas de binaires exotiques...

    Et si t'es plus volontaire (mais juste en bash) Qui peut facilement se remplacer dans les fonctions ci dessus:

    ltrimv2() {
        ltrim "${!1}"
        export ${1}="${__ltrim}"
    }
    
    rtrimv2() {
        rtrim "${!1}"
        export ${1}="${__rtrim}"
    }
    

    Si ça t'interresse j'ai quelques fonctions plus ou moins utiles là : http://code.flyou.net/dev/unstable/F01common.lib/

Suivre le flux des commentaires

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