regex - change - vim replace %s
Vim: ¿Cómo excluyo una palabra completa de mi búsqueda? (4)
Una pregunta bastante básica, estoy tratando de escribir una expresión regular en Vim para que coincida con cualquier frase que comience con "abc "
directamente seguido de otra cosa que no sea "defg"
.
He usado "[^defg]"
para "[^defg]"
cualquier caracter que no sea d, e, f o g.
Mi primer instinto fue probar /abc [^/(defg/)]
o /abc [^/<defg/>]
pero ninguno de esos funciona.
/ abc / [^ d] [^ e] [^ f] [^ g]
Es bastante engorroso para palabras más grandes, pero funciona como un encanto.
Aquí está la cadena de búsqueda.
/abc /(defg/)/@!
El concepto que está buscando se llama aserción negativa de anticipación. Prueba esto en vim para obtener más información:
:help /@!
Aquí vamos, este es un peludo:
//%(/%(./{-}/)/@<=XXXXXX/zs/)*
(reemplace XXXXXX con la palabra de búsqueda). Esto buscará todo lo que no contenga XXXXXX. Imagino que si lo hiciste:
/abc /%(/%(./{-}/)/@<=defg/zs/)*
Esto puede funcionar como lo desees. ¡Espero que esto ayude un poco!
precedido o seguido por?
Si es algo que comienza con ''abc'' que no es (inmediatamente) seguido de ''defg'', quiere la solución de bmdhacks .
Si es algo que comienza con ''abc'' que no está (inmediatamente) precedido por ''defg'', quiere un aspecto negativo detrás:
//%(defg/)/@<!abc /
Esto coincidirá con cualquier ocurrencia de ''abc'' siempre que no sea parte de ''defgabc''. Ver :help /@<!
para más detalles.
Si desea hacer coincidir ''abc'' siempre que no sea parte de ''defg. * Abc'', simplemente agregue un .*
:
//%(defg.*/)/@<!abc /
Hacer coincidir ''abc'' solo en líneas donde ''defg'' no ocurre es similar:
//%(defg.*/)/@<!abc /%(.*defg/)/@!/
Aunque, si solo hace esto para una sustitución, puede hacerlo más fácil combinando :v//
y :s//
:%v/defg/s/abc /<whatever>/g
Esto sustituirá ''<whatever>'' por ''abc'' en todas las líneas que no contengan ''defg''. Ver :help :v
para más.