2010-07-27 54 views
2

J'ai une chaîne qui peut aller de la chaîne vide à une liste arbitraire de nombres délimités par des virgules. Par exemple: "1,2,3"Existe-t-il une seule expression régulière pour remplacer un nombre dans une liste délimitée?

Malheureusement, lorsque j'écris le code pour supprimer un élément, j'ai un tas d'instructions if - principalement pour traiter s'il s'agit du premier, du dernier ou du seul élément de la liste. Je continue à penser qu'il doit y avoir un meilleur moyen!

Par exemple, il me faudrait être en mesure d'éliminer l'élément '2' dans les listes suivantes:

"1,2,3" 
"1,3,2" 
"2,1,3" 
"2" 
"12,2,21" 
"" 

Répondre

1

Cela devrait faire ce que vous voulez:

/(\b|,)2(\b|,)/ 
+0

Ahhh j'ai oublié \ b. C'est exactement ce que je cherchais, merci! – Zugwalt

+0

si le 2 est au milieu, cela supprimera la virgule avant et la virgule après. Exemple: echo "1,2,3" | sed -e 's/\\ (\ b, \\) 2 \ (\ b, \\) //' vous donne: "13" mais devrait vous donner "1,3" – JasonWoof

0

Retrait (voir ci-dessous pour le remplacement)

Je ne pouvais pas trouver une seule expression simple à supprimer, donc il semble que la meilleure chose est juste pour correspondre successivement chacun des motifs:

echo "x,x,1,x,2,x,x" | sed -e 's/,x,/,/g; s/^x,//; s/,x$//; s/^x$//' 

Un peu bavard, mais très lisible.

Remplacement

echo "x,x,1,x,2,x,x" | sed -e 's/,x,/,y,/g; s/^x,/y,/; s/,x$/,y/; s/^x$/y/'