Forum Programmation.shell Sed et les caractères spéciaux

Posté par  . Licence CC By‑SA.
Étiquettes :
0
17
sept.
2017

Bonjour à tous.tes,

Je travaille sur de gros fichiers textes dans lesquels je souhaite garder certains caractères et en supprimer d'autres.
Les caractères à supprimer ne sont pas connus d'avance mais après une opération de filtrage je les sauvegarde dans une variable.

La variable qui contient les caractères à supprimer est, dans le cas qui m'intéresse, égale à :
°,!/.·"«»()[]@…0123456789

Voici le code que j'ai tenté d'utiliser pour supprimer tous ces caractères de mon gros fichier texte mais qui ne marche pas :
sed -i 's~^[$variable]~~g' mon_gros_fichier_texte.txt

Est-ce que quelqu'un pourrait m'aider?

Merci d'avance

  • # En modifiant la position d'un caractère

    Posté par  . Évalué à 3. Dernière modification le 18 septembre 2017 à 01:55.

    variable=']°,!/.·"«»()[@…0123456789'
    sed 's/['"${variable}"']//g' mon_gros_fichier_texte.txt
    

    On peut aussi faire un peu plus court avec :

    variable=']°,!/.·"«»()[@…0-9'
    sed 's/['"${variable}"']//g' mon_gros_fichier_texte.txt
    
  • # En modifiant la position d'un caractère

    Posté par  . Évalué à 2.

    variable=']°,!/.·"«»()[@…0123456789'
    sed -i 's/['"${variable}"']//g' mon_gros_fichier_texte.txt
    

    On peut aussi faire un peu plus court avec :

    variable=']°,!/.·"«»()[@…0-9'
    sed -i 's/['"${variable}"']//g' mon_gros_fichier_texte.txt
    
  • # C'est un job pour tr

    Posté par  . Évalué à 6.

    Ce que tu décrit est plus simple à faire avec tr, il n'a pas d'option -i comme sed, mais c'est facile d'enregistrer dans un fichier temporaire puis faire un mv -f pour écraser le fichier d'origine (c'est ce que fait en pratique sed -i):

    tr -d "$variable" < mon_gros_fichier_texte.txt > mon_gros_fichier_texte.txt.tmp && mv -f mon_gros_fichier_texte.txt.tmp mon_gros_fichier_texte.txt

    (voir la page de manuel de tr pour les caractères spéciaux et les classes de caractères)

    • [^] # Re: C'est un job pour tr

      Posté par  . Évalué à 2. Dernière modification le 19 septembre 2017 à 15:58.

      J'ai "plussoyé" la proposition faite par wismerhill
      car la commande tr est plus appropriée pour remplacer ou supprimer des caractères dans un fichier.

      De plus, on évite le problème du caractère ] dans la liste pour la classe de caractères de la regexp pour sed
      dans laquelle il est impossible de faire autrement que de metttre ce caractère en premier de la liste.

  • # bbe et sponge

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

    Juste au cas où… Pour d'autres qui tomberaient ici avec leurs recherches sur le web :)

    J'avais des choses difficiles à réaliser avec sed à cause de l’échappement, etc. (je sais plus trop…) Toujours est-il que j'ai été amené ce jour là à utiliser une autre commande !

    #!/bin/bash
    bbe -e 's|\x0d|\x0d\x0a|g' "$1" | sponge "$1"
    bbe -e 's|\x0d\x0a\x0a|\x0d\x0a|g' "$1" | sponge "$1"
    bbe -e 's|\x0d\x0a|\x0a|g' "$1" | sponge "$1"

    (↑ Il y avait un mélange de toutes sortes de retours à la ligne dans des fichiers textes…, hum…)

    apt install bbe

    bbe : binary block editor

    apt install moreutils

    sponge : soak up standard input and write to a file

Suivre le flux des commentaires

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