Supprimer tout ce qui précéde un pattern de caractères ?

Résolu
Bonjour,
j'ai des lignes de texte de ce genre dans mon_fichier.txt :
monsieur-durandXXXJean-dupond
directeur
madame-joséphineXXXarlette jeane
assistance de direction

etc.

Je souhaite simplement enlever tout ce qui précédent les XXX (les XXX y compris) et
la commande :
sed -i '/^[a-zA-Z]+XXX/d' mon_fichier.txt

ne me donne rien, je ne comprends pas pourquoi.
Merci d'avance et bonne soirée !

--
"Si vous ne pouvez expliquer un concept à un enfant de six ans, c'est que vous ne le comprenez pas complètement." -A. Einsten-

2 réponses

  1. Contributeur
    Salut,

    $ cat plop 
    monsieur-durandXXXJean-dupond
    directeur
    madame-joséphineXXXarlette jeane
    assistance de direction 
    
    $ sed 's/.*XXX//' plop 
    Jean-dupond
    directeur
    arlette jeane
    assistance de direction 
    
    $

    1
    1. Merci zipe31 :)
      je ne sais pas pourquoi je vais toujours chercher si loin parfois.

      Par contre je n'arrive pas à supprimer les lignes vides de mon fichier avec :
      sed -i '/^$/d' mon_fichier.txt

      Il doit y avoir une subtilité quelque part... :S

      EDIT :

      je souhaiterais ensuite pouvoir remplacer tous les sauts de lignes impairs par une virugle+espace (pour mettre les titres des gens en face de leurs noms.
      Peut-être avec awk ? Ceci permettant d'afficher que les lignes impaires :
      awk 'NR % 2 == 1' mon_fichier.txt
      je pensais partir de ça, mais il y a peut-être plus court/simple...

      Merci !
      "Si vous ne pouvez expliquer un concept à un enfant de six ans, c'est que vous ne le comprenez pas complètement." -A. Einsten-
      0
      1. Remarque : bon comme les lignes vides n'apparaissaient que sur une ligne sur trois, j'ai pu faire un :
        sed -i '0~3d' mon_fichier.txt
        mais je souhaite quand même comprendre ce qui je joue pas avec la suppression des lignes vides...
        0
      2. Contributeur
        Par contre je n'arrive pas à supprimer les lignes vides de mon fichier avec : sed -i '/^$/d' mon_fichier.txt
        Il doit y avoir une subtilité quelque part... :S

        Simplement parce que ta ligne vide ne doit pas être totalement vide, il se peut qu'il y ait des caractères non-imprimables ;-\

        Pour le savoir :

        cat -A ton_fichier
        ou
        sed -n l ton_fichier


        je souhaiterais ensuite pouvoir remplacer tous les sauts de lignes impairs par une virugle+espace (pour mettre les titres des gens en face de leurs noms.

        $ cat plop 
        monsieur-durandXXXJean-dupond
        directeur
        madame-joséphineXXXarlette jeane
        assistance de direction 
        
        $ sed 'N;s/.*XXX//;s/\n/, /' plop 
        Jean-dupond, directeur
        arlette jeane, assistance de direction 
        
        $
        0
      3. Salut et merci de ton aide précieuse encore une fois !

        1. Il y a ça lorsque je fais un cat -A, sur la ligne vide : ^M$
        2. avec la commande sed j'ai ce message d'erreur : sed: -e expression n°1, caractère 1: commande manquante

        la deuxième commande sed, pour remettre les choses en ordre, fonctionne quant à elle presque très bien :

        $ cat plop
        jean-unXXXjean jacques 
        assistant du chef 
        
        paul-deuxXXXjean rené 
        patron dir'gén 
        
        marie-andréeXXXjeanne d'arlequin 
        assistante domestique 
        
        manu-joséXXXmanuel oliveira 
        gardien dîmmeuble


        $ sed 'N;s/.*XXX//;s/\n/, /' plop
        jean jacques, assistant du chef 
        jean rené 
        patron dir'gén,  
        jeanne d'arlequin, assistante domestique 
        manuel oliveira 
        gardien dîmmeuble 
        


        Lorsque je disais une ligne sur deux, c'était pour mettre en face de chaque personnage sa fonction, or ici ça rate une personne sur deux. Le hic c'est que je ne comprends pas pourquoi, la commande est compréhensible il me semble. Y a même des virgules qui ne semblent pas s'être affichées.
        0
      4. Contributeur
        1. Il y a ça lorsque je fais un cat -A, sur la ligne vide : ^M$
        C'est que ton fichier provient d'un système Windows. Le "^M" est la marque de fin de ligne spécifique au format Windows ;-(

        Il faut au-préalable convertir ton fichier au format Unix à l'aide du programme "dos2unix" (à installer si pas présent).
        Tu peux aussi le faire avec "sed", voir la FAQ : Conversion retours chariots DOS (CRLF) / UNIX (LF)

        2. avec la commande sed j'ai ce message d'erreur : sed: -e expression n°1, caractère 1: commande manquante
        Attention c'est un ELLE minuscule et non pas un UN :
        sed -n l plop 


        Une fois que tu auras converti ton fichier au format Unix, tu pourras exécuter cette commande :

        $ cat plop 
        monsieur-durandXXXJean-dupond
        directeur
        
        madame-joséphineXXXarlette jeane
        assistance de direction 
        
        jean-unXXXjean jacques 
        assistant du chef 
        
        paul-deuxXXXjean rené 
        patron dir'gén 
        
        marie-andréeXXXjeanne d'arlequin 
        assistante domestique 
        
        manu-joséXXXmanuel oliveira 
        gardien dîmmeuble
        
        $ sed '/^$/!N;s/.*XXX//;s/\n/, /' plop 
        Jean-dupond, directeur
        
        arlette jeane, assistance de direction 
        
        jean jacques , assistant du chef 
        
        jean rené , patron dir'gén 
        
        jeanne d'arlequin , assistante domestique 
        
        manuel oliveira , gardien dîmmeuble
        
        $
        0
      5. Salut,
        alors merci pour ton astuce là, mon fichier était apparemment au format DOS et la commande sed avec un ELLE minuscule me retourne ça sur les lignes vides : \r$

        Une fois passé au format UNIX la commande d'après marche bien, mais comme toi ici, j'ai des espaces qui viennent avant la virgule à partir de la troisième ligne. Bon ce n'est pas bien grave mais c'est encore un truc qui me paraît mystérieux :-)
        0