Remplacer sous condition avec SED

Résolu
pcsystemd Messages postés 702 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 6 novembre 2024 - 6 nov. 2024 à 08:03
mamiemando Messages postés 33364 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 novembre 2024 - 7 nov. 2024 à 18:28

Bonjour,

J'utilise la commande SED ci-dessous pour remplacer la chaine "C206" par "'206_"

sed -e "s/C206/'206_/g"

Mais si je souhaite également remplacer la chaine "C2060" par "'206_", peut on utiliser une condition ou autre avec SED pour remplacer soit l'une soit l'autre chaine de caractère?

J'ai essayé cette commande mais cela n'ai pas correct.

sed -e "s/C20[6-0]/'206_/g"

Une idée?
Merci


A voir également:

3 réponses

mamiemando Messages postés 33364 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 novembre 2024 7 801
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

2
pcsystemd Messages postés 702 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 6 novembre 2024 23
6 nov. 2024 à 16:25

Je viens de tester et  les deux solutions fonctionnent.

Merci


0
brucine Messages postés 17754 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 19 novembre 2024 2 589
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.

0
mamiemando Messages postés 33364 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 novembre 2024 7 801
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

0
brucine Messages postés 17754 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 19 novembre 2024 2 589 > mamiemando Messages postés 33364 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 novembre 2024
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.

0
mamiemando Messages postés 33364 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 novembre 2024 7 801 > brucine Messages postés 17754 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 19 novembre 2024
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

0
brucine Messages postés 17754 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 19 novembre 2024 2 589 > mamiemando Messages postés 33364 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 novembre 2024
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.

0
mamiemando Messages postés 33364 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 novembre 2024 7 801 > brucine Messages postés 17754 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 19 novembre 2024
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 ;-)

0