2013-01-03 13 views
22

Chcę odkażać niektóre dane wejściowe i zamienić kilka znaków na akceptowalne dane wejściowe, np. duński "å" z "aa".Wyrażenie regularne w sed dla wielu zamienników w jednym oświadczeniu

Można to łatwo zrobić za pomocą kilku instrukcji, np. /æ/ae/, /å/aa/, /ø/oe/, ale ze względu na ograniczenia narzędzi, chcę móc to zrobić w pojedynczym wyrażeniu regularnym.

mogę złapać wszystkich istotnych sprawach (/[(æ)(ø)(å)(Æ)(Ø)(Å)]/), ale wymiana nie działa jak chcę go (ale prawdopodobnie całkowicie zgodnie z przeznaczeniem):

$ 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 

(pierwsze echo jest to, aby pokazać, że nie jest zagadnieniem kodowania)

Tak na marginesie, problemem z narzędziem jest to, że chciałbym również użyć tego samego wyrażenia regularnego w Sublime Text 2 snippet.

Ktoś jest w stanie rozpoznać, co jest nie tak z moim oświadczeniem regex?

Z góry dziękuję.

Odpowiedz

38

podzielić ją na kilka sed oświadczeń, oddzielonych ;:

sed 's/æ/ae/g;s/ø/oe/g;s/å/aa/g;s/Æ/Ae/g;s/Ø/Oe/g;s/Å/Aa/g' 
+0

Blarg, oczywiście. Powinienem bardziej podkreślić użycie Sublime Text snippet, ale jest to całkowicie poprawna odpowiedź na główne pytanie. – Jan

+1

@ Jan, dzięki. Nie sądzę, że możesz napisać pojedyncze wyrażenie, które zastępuje jeden z kilku możliwych dopasowań z jednym z kilku zamienników, szczególnie nie z 'sed'. –

6

Z

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

będziesz rade.

Więc przełożyć na co trzeba

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

Blarg, oczywiście. Powinienem bardziej podkreślić użycie Sublime Text snippet, ale jest to całkowicie poprawna odpowiedź na główne pytanie. – Jan

3

To może pracować dla Ciebie (GNU sed):

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

Działa poprzez dodanie tabeli odnośników do końca linii, zapętlenie dopóki wszystkie klucze nie zostaną zastąpione, usunie tablicę odnośników.