2009-05-02 12 views
2

私は以下のような行があります。括弧内の文字列を二重引用符で囲みます

fullname =(これはテスト名です)。

"("と ")"内のすべての文字列を二重引用符で囲みたいとします。

すなわちfullname =( "this"は "a" "test" "name")です。

誰かがそれを行うために私にvimの正規表現を与えることはできますか?

答えて

3

これはそれをしない:

:%s/\v(\(.*)@<=[[:alnum:]]+(.*\))@=/"&"/g 

は、入力が不正な形式であれば正規表現で(例えば括弧内)ネストされたパターンにマッチすることは間違って行くことに注意してください。上の例ではネストされた括弧はまったく扱われず、引用された括弧やエスケープされた括弧も壊れてしまいます。取り扱い注意。

次のように読み取ります

 
:%s    substitute on all lines 
/    matching 
\v    (with "very magic" switched on) 
(\(.*)@<=   a position that follows an opening paren, on this line 
[[:alnum:]]+  a series of alphanumeric characters (i.e. "words") 
(.*\))@=   that are followed by a closing paren, on this line 
/    replace with 
"&"    the match, in quotes 
/g    globally 

Vimが実際に可変長ルックビハインドをサポートしていないことは注目に値する事実です。ほとんどの現代正規表現の実装はそうではありません。

+0

非常に魔法は何をしますか? – chappar

+0

これは、特定の文字をエスケープする必要がなくなり、正規表現が通常より短くなります。 vim help - :h \ vを参照してください。 – Tomalak

0

このコマンドは、スペースではないすべてのものを置き、タブ、引用符に記号、括弧やセミコロンに等しい:

:s/[^ \t=();][^ \t=();]*/"&"/g 

これは、同様fullnameを引用していますが、手動でそれらの引用符を削除することができますので、予めご了承ください。

自動化が遅いため、作業の一部を手動で行う価値があります。

次のコマンドを実行します。

:help substi 

のvimで正規表現の置換についてのヘルプを表示するために。

+0

@pts、私は手動での除去を望みません。 – chappar

+0

動作しません。これはすべてを引用符で囲みます。 – Tomalak

+0

私はそれが答えに記載されているように働いていると思う、私は私の答えを提出する前にそれを試してみました。あなたは 'すべて 'によって何を意味しますか? – pts

4

次のように私はこれを行うだろう:

:s/\<\w\+\>/"&"/gc 

により、各交換のために要求されます確認スイッチ「C」へ。 'fullname'と残りの行の 'a'(all)の置換には 'n'(no)と答えます。

+0

この回答は実際に問題を解決するものではありません。それは "すべての言葉を引用する"部分をしますが、 "内かっこのみ"の部分を完全に忘れてしまいます。 – Tomalak