2009-06-10 7 views
6

私は、単語のリストを等しく長い単語のリストで置き換える必要があります。単語のリストを別の同じ長さの単語リストに置き換えることはできますか?

したがって、たとえば、あなたが持っている: "A"、 "B"、 "C"、 "D"、 "E"、 "F"

をそして、あなたはの大文字バージョンで各単語を置き換えたいです各単語: "A"、 "B"、 "C"、 "D"、 "E"、 "F"

私は正規表現を使用して各文字列を検索する方法を知っている: (\ | | \ bはc \ | d \ | e \ | f)

あなたは、それぞれの単語に対してグローバル置換を行うことができます。しかし、言葉の長さが長くなると、このアプローチは邪魔にならず、控えめになります。

何とかグローバル置換を行う方法はありますか?類似:

:%s/\(a\|b\|c\|d\|e\|f\)/INSERT_REPLACEMENT_LIST/ 

これが可能であるかどうかわかりません。

+1

私の好奇心を満たすために、これはどういう意味ですか?実際には、それは何のために良いのですか?何も気にしないので、私は疑問に思いました。 – Rook

+0

@Idigas、いくつかの悪いMatlabコードでリファクタリングをしています。私は、コードが20〜30のグローバルを使用していることに気がつきました。そのグローバルは大文字ではなく、グローバリゼーションを明示的にグローバルにするために名前が付けられているわけではありません。 - >だから私はすべて大文字にするためにそれらの名前を変更したいと思います。あるいは同じ名前でも構いませんが、各変数名の後ろに "_g"を追加してください。 –

+0

@Idigas、最終的に私はMatlabをC言語で実装する予定です。だから、Cで変換する前にできるだけエレガントなコードを作成したいと思っています。 –

答えて

9

置換えにマップされた項目の辞書を使用して、検索/置換の右側にあるものを使用できます。

:let r={'a':'A', 'b':'B', 'c':'C', 'd':'D', 'e':'E'} 
:%s/\v(a|b|c|d|e)/\=r[submatch(1)]/g 

:h sub-replace-\=:h submatch()を参照してください。その行を1つの行に詰め込むには、リテラル辞書を使用できます。

:%s/\v(a|b|c|d|e)/\={'a':'A','b':'B','c':'C','d':'D','e':'E'}[submatch(1)]/g 

あなたが文字を大文字化の与えた具体的な例としては、より簡単に

:%s/[a-e]/\U\0/g 
+0

s/\\(\ a \ + \\)/ \ U \ 0/gアルファベットの文字列を大文字に変更します。 –

+1

あなたがこれを頻繁にやっていることがわかったら、これにvim関数を定義します(http://stackoverflow.com/questions/765894/can-i-substitute-multiple-items-in-a-single-regular-expression-in -vim-or-perl/766093#766093) – rampion

+0

@Brian、あなたの代わりに "\ v"は何ですか? –

2

として行われます:%sの/(\ | F D \ | | | E \ C \ | \をB)/\ U \ 0/g

関連する問題