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

Résolu/Fermé
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 - 13 avril 2013 à 20:17
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 - 18 avril 2013 à 13:13
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 !
A voir également:

2 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
13 avril 2013 à 20:21
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
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 110
Modifié par Swiss Knight le 14/04/2013 à 11:34
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
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 110
14 avril 2013 à 11:21
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
14 avril 2013 à 14:03
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
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 110
Modifié par Swiss Knight le 14/04/2013 à 19:48
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
14 avril 2013 à 20:38
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
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 110
16 avril 2013 à 12:11
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