Vim, encuentra y reemplaza `^ (. *)` Con `^ {. *}`

4

Estoy tratando de encontrar y reemplazar caret open_parentheses some_content close_parentheses (es decir. ^(.*) ) con caret open_curly_bracket the_same_content close_curly_bracket (es decir. ^{.*} pero tengo problemas

1) No entiendo cómo conservar el contenido de comodín coincidente .*

2) No veo como formular el secuencia de escape para especificar paréntesis y paréntesis.

He estado pasando por esta Página por un poco y han intentado lo siguiente

%s/^(*)/^{*} /gc
%s/^(.*)/^{.*} /gc
%s/^/(.*/)/^{.*} /gc
rudolph9
fuente
5
Que zanahorias ¿Querías decir caret?
kinokijuf
Sí, quise decir caret!
rudolph9

Respuestas:

6

Todos esos personajes tienen una funcionalidad especial dependiendo de si un personaje de escape los precede. Esto depende del carácter de si una secuencia de escape que precede al carácter con una funcionalidad especial lo utiliza (es decir, un ^ ejecuta una funcionalidad especial, un \^ no, donde un ( hace no ejecutar una funcionalidad especial, y una \( hace.

La expresión que buscas es la siguiente

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

La expresión literalmente estado, coincide con una signo de intercalación seguido de un paréntesis abierto seguido por Cualquier personaje excepto un close_parenthesis seguido de un paréntesis cercano y reemplazar con una a signo de intercalación seguido de un open_curly_bracket seguido por el contenido encontrado al buscar any_character_except a close_parenthesis (es decir, el contenido entre \( y \) ) seguido de una close_curly_bracket

Nota: existen otros enfoques también

fluffy
fuente
¿Cómo digo la primera aparición de los ')' close_parentheses?
rudolph9
La expresión regular funciona pero coincidió con los últimos close_parentheses antes del carácter de nueva línea.
rudolph9
1
Hay dos maneras de hacerlo. Uno es reemplazar * por \{-} para que coincida con pocos . como sea posible. Ver :help /\{-. El otro es reemplazar. . por [^)] para que coincida con cualquier cosa no una ). Ver :help /[].
garyjohn
Sí, me olvidé de la codicia. Gracias @kinokijuf por editar mi respuesta!
fluffy
@fluffy pero solo corregí varios errores tipográficos
kinokijuf
0

¿Realmente estás buscando el personaje de caret?
El caret generalmente significa comenzar a buscar el patrón al principio de una línea.

Asumiendo que eres ...

algo de texto ^ (más texto) y más ^ (más texto) y más

--Y-- tú lo que cambió a:

algo de texto ^ {más texto} y más ^ {más texto} y más

Entonces, use:

: 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

Si desea que la búsqueda y el reemplazo abarquen todo el archivo, use:

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

El% significa todo el archivo.

broomdodger
fuente
Mi suposición en esta pregunta es que está buscando reemplazar las expresiones regulares por otras expresiones regulares, utilizando una expresión regular. Siempre complicado. :)
fluffy