web-dev-qa-db-ja.com

Vim、検索して `^(。*)`を `^ {。*}`に置き換えます

_caret open_parentheses some_content close_parentheses_(つまり、^(.*))を_caret open_curly_bracket the_same_content close_curly_bracket_(つまり、_^{.*}_)で見つけて置き換えようとしていますが、問題があります。

1)一致したワイルドカードコンテンツを保持する方法がわかりません_.*_

2)中括弧と括弧を指定するためのエスケープシーケンスを作成する方法がわかりません。

私はかなり長い間 this ページを通過していて、次のことを試みました

_%s/^(*)/^{*} /gc
%s/^(.*)/^{.*} /gc
%s/^/(.*/)/^{.*} /gc
_
5
rudolph9

これらの文字はすべて、エスケープ文字が先行するかどうかに応じて特別な機能を備えています。これは、特別な機能を持つ文字の前にあるエスケープシーケンスがそれを利用するかどうかによって異なります(つまり、^は特別な機能を実行し、\^は実行しませんが、(は使用しますnotは特別な機能を実行し、\(は実行します。

お探しの表現は以下の通りです

s/\^(\([^)])\))/\^\{\1\}/g

式は文字通り、caretに続いてopen_parenthesisに続いてclose_parenthesisを除く任意の文字に続いてclose_parenthesisと一致します。 =そしてaaに置き換えますcaretに続いてopen_curly_bracketに続いて検索時に見つかったコンテンツany_character_except close_parenthesis(つまり、\(および\))の後にclose_curly_bracket

注:他のアプローチも存在します

6
fluffy

あなたは本当にキャレットキャラクターを探していますか?
キャレットは通常、行の先頭からパターンを探し始めることを意味します。

あなたが...

いくつかのテキスト^(より多くのテキスト)およびより多くの^(より多くのテキスト)およびより多く

-そして-あなたはそれが何に変わったか:

いくつかのテキスト^ {より多くのテキスト}およびより多くの^ {より多くのテキスト}およびより多く

次に、以下を使用します。

:s-\^(([^)] +))-^ {\ 1} -gc

:s      the substitute command
-       start pattern, use - instead of / for clarity
\^      look for the ^ char, need to escape
(       followed by (
\(      start capture
[^)]\+  one or more chars except )
\)      end capture
)       followed by )
-       start replace, use - instead of / for clarity
^{      replace ^( with ^{
\1      replace with the captured text
}       replace ) with }
-       start flags, use - instead of / for clarity
gc      confirm replace for each occurance in the line

検索と置換をファイル全体に適用する場合は、次を使用します。

:%s-\^(([^)] +))-^ {\ 1} -gc

%はファイル全体を意味します。

0
broomdodger