web-dev-qa-db-fra.com

Expression régulière dans sed pour plusieurs remplacements en une seule instruction

Je veux nettoyer certaines entrées et remplacer plusieurs caractères par des entrées acceptables, par exemple un danois 'å' avec 'aa'.

Cela se fait facilement en utilisant plusieurs instructions, par exemple /æ/ae/, /å/aa/, /ø/oe/, Mais en raison des limitations de l'outil, je veux pouvoir le faire en une seule expression régulière.

Je peux attraper tous les cas pertinents (/[(æ)(ø)(å)(Æ)(Ø)(Å)]/) mais mon remplacement ne fonctionne pas comme je le veux (mais probablement complètement comme prévu):

 $ temp="RødgrØd med flæsk"

 $ echo $temp
 RødgrØd med flæsk

 $ echo $temp | sed 's/[(æ)(ø)(å)(Æ)(Ø)(Å)]/(ae)(oe)(aa)(Ae)(Oe)(Aa)/g'
 R(ae)(oe)(aa)(Ae)(Oe)(Aa)dgr(ae)(oe)(aa)(Ae)(Oe)(Aa)d med fl(ae)(oe)(aa)(Ae)(Oe)(Aa)sk

(la première ligne d'écho est de montrer que ce n'est pas un problème d'encodage)

Soit dit en passant, le problème de l'outil est que je voudrais également utiliser la même expression régulière dans un extrait de texte sublime 2 .

Quelqu'un est-il capable de discerner ce qui ne va pas avec ma déclaration regex?

Merci d'avance.

31
Jan

Divisez-le en plusieurs instructions sed, séparées par ;:

sed 's/æ/ae/g;s/ø/oe/g;s/å/aa/g;s/Æ/Ae/g;s/Ø/Oe/g;s/Å/Aa/g'
53
Anders Johansson

Avec

sed -e 's/Find/Replace/g;s/Find/Replace/g;[....];/Find/Replace/g'

vous ferez l'affaire.

Alors traduisez ce dont vous avez besoin

sed -e 's/æ/ae/g;s/ø/oe/g;s/å/aa/g;s/Æ/Ae/g;s/Ø/Oe/g;s/Å/Aa/g'
9
DonCallisto

Cela pourrait fonctionner pour vous (GNU sed):

sed -r 's/$/\næaeøoeåaaÆAeØOeÅAa/;:a;s/([æøåÆØÅ])(.*\n.*\1(..))/\3\2/;ta;s/\n.*//' file

Il fonctionne en ajoutant une table de recherche à la fin de la ligne, en boucle jusqu'à ce que toutes les clés soient remplacées, puis supprime la table de recherche.

3
potong