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 (courriel, 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.