web-dev-qa-db-ja.com

Vimで文字列を囲む引用符を置き換える?

私は<Foobar Name='Hello There'/>に似ていて、単一引用符を二重引用符に変更する必要があります。 :s/\'.*\'/\"\0\"を試しましたが、<Foobar Name="'Hello There'"/>が生成されてしまいました。 \0\1で置き換えると、二重引用符内に空白の文字列しか生成されませんでした-引用符内に見つかった文字列( "Hello There")だけを作成する必要があるという、特別な構文がないマークは\1に割り当てますか?

29
ravuya

グループ化を使用する必要があります:

:s/\'\(.*\)\'/\"\1\"

このようにして、引数1(つまり、\ 1)は、\(および\)で区切られたものに対応します。

23
rui

これをかなり頻繁に行う場合は、 surround.vim もあります。 cs'"で前後の引用符を変更します。

57
kejadlen

%s/'\([^']*\)'/"\1"/g

[^']*の代わりに.*を使用することをお勧めします。

'apples' are 'red'"apples' are 'red"に変換されます

14
rayd09

私が何かを逃していない限り、s/\'/"/g仕事?

8
tosh

参考までに-すべての二重引用符を単一に置き換えるには、これが正しい正規表現です-上記のrayd09の例に基づく

:%s/"\([^"]*\)"/'\1'/g
6
BandsOnABudget

キャプチャする式の部分を丸括弧で囲む必要があります。

s/\'\(.*\)\'/"\1"/

しかし、意図しないマッチングで問題が発生する可能性があります。ファイル内の単一引用符を二重引用符で簡単に置き換えることができるでしょうか?

2
martin clayton

あなたは正しい考えを持っています-_"\1"_をreplace句として使用したいが、最初に "Hello There"部分をキャプチャグループ1に配置する必要があります(0は完全一致です)。試してください:

:%/'\(.*\)'/"\1"

1
Josh

ファイル全体でこれを実行したいと仮定します...

Nモード:

ggvG$ [SHIFT+:]  

Xモード:

'<,'>/'/" [RET]
0
Eddie B