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

Résolu
Swiss Knight Messages postés 2257 Statut Membre -  
Swiss Knight Messages postés 2257 Statut Membre -
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. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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
  2. Swiss Knight Messages postés 2257 Statut Membre 110
     
    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. Swiss Knight Messages postés 2257 Statut Membre 110
       
      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. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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. Swiss Knight Messages postés 2257 Statut Membre 110
       
      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. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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. Swiss Knight Messages postés 2257 Statut Membre 110
       
      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