2013-01-03 40 views
22

我想清理一些输入并用可接受的输入替换几个字符,例如丹麦'å'与'aa'。在sed中的正则表达式在一个语句中的多个替换

这很容易用几种语句完成,例如, /æ/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 snippet也使用相同的正则表达式。

任何人都能看出我的正则表达式有什么问题吗?

在此先感谢。

回答

38

把它分解成几个sed报表,通过;分隔:

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

Blarg,当然。我应该更强调Sublime Text snippet的用法,但这是对主要问题的完全正确答案。 – Jan

+1

@Jan,谢谢。我不认为你可以编写一个正则表达式替换几个可能的匹配中的一个,特别是不用'sed'。当然,Blarg, –

6

随着

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' 
+0

。我应该更强调Sublime Text snippet的用法,但这是对主要问题的完全正确答案。 – Jan

3

这可能为你工作(GNU SED):

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

它的工作原理是将一个查找表行的末尾,循环直到所有密钥都被替换,然后删除查找表。