Remplacer sous condition avec SED
Résolumamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 7 nov. 2024 à 18:28
- Remplacer sous condition avec SED
- Excel cellule couleur si condition texte - Guide
- Remplacer disque dur par ssd - Guide
- Remplacer word - Guide
- Quel site pour remplacer coco - Accueil - Réseaux sociaux
- Remplaçant de Coco : quelles solutions pour tchater gratuitement en ligne ? - Accueil - Réseaux sociaux
3 réponses
Modifié le 6 nov. 2024 à 16:04
Bonjour,
L'expression rationnelle que tu proposes est effectivement incorrecte. C20[6-0] signifie C suivi de 2 suivi de 0 suivi d'un caractère compris entre 6 et 0 au sens ASCII. L'idée d'utiliser une expression rationnelle plutôt que deux sed reste néanmoins bonne, reste juste à l'écrire correctement.
Comme expliqué ici, GNU sed supporte l'opérateur \| (et même l'opérateur \?). Pour rappel, dans le langage des expressions rationnelles :
- aaa|bbb signifie soit "aaa" soit "bbb"
- xyza? signifie que "a" est répété 0 ou 1 fois, ce qui autorise "xyz" ou "xyza"
Dans mon cas ma version de sed est assez récente pour les supporter :
sed --version | head -n2
(mando@velvet) (~) $ sed --version | head -n2 sed (GNU sed) 4.9 Empaqueté par Debian
Si tu es dans le même cas, l'une de ces deux commandes devraient donc faire l'affaire (la première est plus élégante) :
echo "xxxxxC206yyyyC2060zzzz" | sed -e "s/C2060\?/'206_/g" echo "xxxxxC206yyyyC2060zzzz" | sed -e "s/C206\|C2060/'206_/g"
Résultat :
xxxxx'206_yyyy'206_zzzz
Bonne chance
6 nov. 2024 à 16:25
Je viens de tester et les deux solutions fonctionnent.
Merci
6 nov. 2024 à 16:44
Bonjour,
Je suis désespérément Windows, je n'ai rien pour tester (encore que peut-être si sur ma partition virtuelle Linux Mint) et je n'entends pas grand-chose à sed, mais il me semble y avoir un biais évident: [6-0] représente l'intervalle de tous les chiffres compris entre 6 et 0 et sauf erreur de ma part une seule fois, on échouera donc forcément à trouver 60 (6 puis 0).
Par contre et si j'ai bien compris, le 6 de 206 est toujours présent.
On doit donc pouvoir remplacer en deux lignes, la première en recherchant C206 et la deuxième en remplaçant C2060 ou C206[0].
La question pour faire un "one liner" me semble alors être quel caractère X il y a derrière 206 quand il n'y a pas 0 (espace, fin de "mot"...).
Une recherche C206[X0] va alors ramener les deux cas de figure.
7 nov. 2024 à 15:28
Effectivement, si sed ne supporte pas | ou ?, on peut se ramener à deux seds. Toutefois, cette méthode présente deux désavantages :
- il faut être vigilant à l'ordre dans lequel on fait les seds (il faut d'abord substituer C2060 puis C206)
- on parcourt deux fois le fichier au lieu d'une
Concernant le reste de ta réponse :
- Il n'y a pas d'intérêt à écrire C206[0] plutôt que C2060, c'est synonyme, donc autant écrire C2060.
- C206[X0] signifie C206 suivi soit du caractère X, soit du caractère 0 (donc soit C2060 soit C206X). Outre le fait qu'il faudrait caractériser ce qu'on entend par X, un tel motif ne rattrapera pas ce qu'il faut (notamment, pas les occurrences de C2060). De plus, ton expression sed remplacera ce fameux X ce qui n'est pas le comportement souhaité.
- Une expression sed s'applique à une ligne complète. Les espaces ne sont qu'un caractère comme les autres. Ils ne donc méritent pas de traitement particulier. Note que les fins de lignes ne méritent pas non plus de traitement particulier si l'on fait les deux seds consécutifs que j'évoquais.
À bientôt
7 nov. 2024 à 15:43
X caractérise ce qu'il y a derrière l'expression recherchée et qui sera j'imagine le plus souvent un caractère de ponctuation.
Si, je dis n'importe quoi, X est un point-virgule et qui devrait probablement être échappé C206[X0] va probablement me ramener C206; et C2060 mais c'est en effet idiot puisque je n'aurai pas moyen de me débarrasser dans le remplacement du ; conditionnel.
Je l'ai dit, je ne suis pas un cador Linux et je n'ai pas de manière simple de tester les hypothèses que j'ai faites, je n'ai commenté que parce que, avant toi, personne ne semblait le faire et tu as bien fait de corriger.
7 nov. 2024 à 15:47
Pas de soucis, merci pour tes commentaires. Et si ça t'a permis au passage de découvrir un peu plus sed, ça valait d'autant plus le coup ;-)
Bonne continuation
7 nov. 2024 à 16:03
Tu as (encore) raison mais j'utilise Windows depuis tellement longtemps que c'est devenu un automatisme, je ne pense même pas à apprivoiser ma machine virtuelle Linux.
Pourtant, notamment pour moi qui aime bien taquiner la ligne de commande, les outils Linux sont souvent bien plus puissants que ceux de Windows où c'est parfois très compliqué voire impossible.
On peut peut-être faire le job avec non pas GNUWin32 (je crois qu'il n'existe plus), j'avais testé il y a très longtemps et trouvé cela très lourd, mais avec CygWin ou équivalent.
Modifié le 7 nov. 2024 à 18:28
Tu devrais regarder WSL ou comment avoir disons une Ubuntu sous Windows >=10. Mais si tu veux plus de détails parlons en message privé ou dans une nouvelle discussion, car on s'éloigne du sujet initial ;-)