#1 Le 07/02/2022, à 20:57
- L'Africain
(Résolu) Sed et première occurence d'un caractère
Bonjour,
J'arrive à travailler relativement bien avec sed, mais j'ai un problème récurent. Lorsque je sohaite par exemple travailler sur des parenthèse dans un texte, dans ma commande sed si je met une parenthèse fermante à la fin de ma commande, le problème c'est que sed modifie le texte avec la dernière parenthèse de la ligne dans le cas où il y a plusieurs parenthèse dans la ligne. Ma question est donc comment faire pour que sed reconnaissance toujours la première occurence du caractère ciblé ici une parenthèse et ne cours pas jusqu'au dernier?
Je donne un exemple:
(Rm 1, 10) blblabla blalbla (Eph 3,2)
Si je fait la commande:
sed -i '/s\(([A-Za-z].*[0-9])\)/<ref>\1<\/ref>/g' monfichier
J'aurais comme résultat:
<ref>Rm 1, 10) blblabla blalbla (Eph 3,2</ref>
Or je souhaiterais:
<ref>Rm 1, 10</ref> blblabla blalbla <ref>Eph 3,2<ref>
Merci d'avance pour votre aide.
Dernière modification par L'Africain (Le 08/02/2022, à 13:31)
Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#2 Le 07/02/2022, à 21:16
- MicP
Re : (Résolu) Sed et première occurence d'un caractère
Bonjour
sed -i 's/(/<ref>/g; s/)/<\/ref>/g' monfichier
ou bien :
sed -i 's/(/<ref>/g; s#)#</ref>#g' monfichier
Ce qui donne, par exemple :
michel@debbull:~$ cat monfichier
une (phrase) avec des (mots) entre (parenthèses)
(Rm 1, 10) blblabla blalbla (Eph 3,2)
une (autre phrase) entre parenthèses
michel@debbull:~$
michel@debbull:~$ sed -i 's/(/<ref>/g; s#)#</ref>#g' monfichier
michel@debbull:~$
michel@debbull:~$ cat monfichier
une <ref>phrase</ref> avec des <ref>mots</ref> entre <ref>parenthèses</ref>
<ref>Rm 1, 10</ref> blblabla blalbla <ref>Eph 3,2</ref>
une <ref>autre phrase</ref> entre parenthèses
michel@debbull:~$
Dernière modification par MicP (Le 07/02/2022, à 21:29)
Hors ligne
#3 Le 07/02/2022, à 21:23
- pingouinux
Re : (Résolu) Sed et première occurence d'un caractère
Bonsoir,
Autre solution, en gardant une expression proche de la tienne (elle ne fonctionnait d'ailleurs pas telle quelle) :
sed -i 's/(\([A-Za-z][^(]*[0-9]\))/<ref>\1<\/ref>/g' monfichier
.* doit être remplacé par [^(]*
Hors ligne
#4 Le 07/02/2022, à 21:34
- Tawal
Re : (Résolu) Sed et première occurence d'un caractère
En fait, le vrai problème vient de la gourmandise de *
Il faut utiliser une expression non gourmande.
Pour reprendre l'exemple donné en #1 :
sed -i 's/(\([^)]*\))/<ref>\1<\/ref>/g' monfichier
l'expression [^)]* n'est pas gourmande et s'arrête dès la 1ére parenthèse fermante trouvée.
Tandis que l'expression \(([A-Za-z].*[0-9])\) est gourmande, elle s'arrête à la dernière parenthèse précédée par un chiffre. C'est le .* qui est gourmand.
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#5 Le 07/02/2022, à 21:47
- Compte supprimé
Re : (Résolu) Sed et première occurence d'un caractère
Bonsoir,
Moins savant, mais beaucoup plus lisible:
~ :sed -i 's/)/<ref>/g' fichier
~ :sed -i 's/(/<ref>/g' fichier
Le grand avantage c'est que l'on peut y revenir plusieurs mois après, et on comprendra toujours ce que le code fait.
#6 Le 08/02/2022, à 11:06
- L'Africain
Re : (Résolu) Sed et première occurence d'un caractère
Bonjour,
D'abord merci à tous pour votre aide! C'est toujours touchant de voir le nombre de réponse que l'on reçoit sur ce forum en si peu de temps.
Maintenant la solution qui marche est celle de pingouinux, parce qu'il fait tenir compte du fait que ce ne sont pas toutes les parenthèse qui méritait d'être converties en "ref" mais uniquement celle avec le modèle ref, à savoir les exemple donné avec Rom et Eph.
POur le coup si je comprends bien, on l'expression [^)] signifie "sauf ceci"?
Merci à tous, c'est résolu.
Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#7 Le 08/02/2022, à 11:19
- pingouinux
Re : (Résolu) Sed et première occurence d'un caractère
si je comprends bien, on l'expression [^)] signifie "sauf ceci"?
[^)] : tout caractère, sauf parenthèse fermante
[^)]* : zéro ou plus caractère autre que parenthèse fermante
Hors ligne
#8 Le 08/02/2022, à 12:42
- MicP
Re : (Résolu) Sed et première occurence d'un caractère
…il fait tenir compte du fait que ce ne sont pas toutes les parenthèse qui méritait d'être converties en "ref" …
Pourtant, j'ai beau relire encore et encore le premier message de ce fil,
je n'y trouve rien concernant ce fait qui deviendrait cette condition supplémentaire,
… à savoir les exemple donné avec Rom. …
Je ne trouve pas le mot Rom dans l'exemple donné.
Dernière modification par MicP (Le 08/02/2022, à 12:45)
Hors ligne
#9 Le 08/02/2022, à 12:49
- xubu1957
Re : (Résolu) Sed et première occurence d'un caractère
Bonjour,
Les Épîtres de Saint Paul aux Romains et aux Éphésiens.
Conseils pour les nouveaux demandeurs et pas qu'eux
Important : Pensez à passer vos sujets en [Réso|u] lorsque ceux-ci le sont, au début du titre en cliquant sur Modifier sous le premier message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci. Membre de Linux-Azur
En ligne
#10 Le 08/02/2022, à 13:31
- L'Africain
Re : (Résolu) Sed et première occurence d'un caractère
Je ne trouve pas le mot Rom dans l'exemple donné.
Pardon MicP, je ne voulais pas t'offenser, mes explications n'étaient sûrement pas assez claires. Je te remercie pour ton aide. Et c'est Rm en effet et non pas Rom.
Les Épîtres de Saint Paul aux Romains et aux Éphésiens.
Oui c'est exactement ça!
Dernière modification par L'Africain (Le 08/02/2022, à 19:27)
Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#11 Le 08/02/2022, à 14:31
- MicP
Re : (Résolu) Sed et première occurence d'un caractère
T'inquiètes pas, tout va bien,
c'est juste que je tombe ces jours-ci souvent sur des messages dans lesquels le contexte et la demande sont trop vagues,
alors c'était celui de trop parmi tant d'autres. Ce n'est pas toi que je visais en particulier.
Hors ligne
#12 Le 10/02/2022, à 10:47
- MicP
Re : (Résolu) Sed et première occurence d'un caractère
Dans tout ce qui commence par une parenthèse ouvrante
et qui est suivie d'une chaîne de caractères Rm ou Eph
et qui est suivie d'un caractère espace
et qui est suivit d'un ou plusieurs chiffres
et qui est suivit d'une virgule
et qui est suivie de zéro ou un caractère espace
et qui est suivit d'un ou plusieurs chiffres
et qui est suivit d'une parenthèse fermante
Alors :
Remplacer la parenthèse ouvrante par <ref>
et
remplacer la parenthèse fermante par </ref>
sed -E 's#\(((Rm|Eph) [0-9]+,[ ]{0,1}[0-9]+)\)#<ref>\1</ref>#g' monFichier
Dernière modification par MicP (Le 10/02/2022, à 11:09)
Hors ligne