web-dev-qa-db-ja.com

1つのステートメントで複数の置換を行うsedの正規表現

一部の入力をサニタイズして、いくつかの文字を許容可能な入力に置き換えたい。デンマーク語の「_å_」と「aa」。

これは、いくつかのステートメントを使用して簡単に実行できます。 _/æ/ae/_、_/å/aa/_、_/ø/oe/_ですが、ツールの制限により、これを単一の正規表現で実行できるようにしたいと考えています。

関連するすべてのケース(/[(æ)(ø)(å)(Æ)(Ø)(Å)]/)をキャッチできますが、置換は期待どおりに機能しません(ただし、おそらく完全に意図したとおり)。

_ $ 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
_

(最初のエコー行は、エンコードの問題ではないことを示すためのものです)

余談ですが、ツールの問題は Sublime Text 2スニペット でも同じ正規表現を使用したいということです。

私の正規表現の何が間違っているのかを見分けることができる人はいますか?

前もって感謝します。

31
Jan

;で区切られた、いくつかのsedステートメントに分割します。

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

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

あなたはトリックをします。

だから、あなたが必要なものに翻訳する

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

これはあなたのために働くかもしれません(GNU sed):

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

これは、行の最後にルックアップテーブルを追加し、すべてのキーが置き換えられるまでループしてから、ルックアップテーブルを削除することで機能します。

3
potong