Cómo reemplazar la nth ocurrencia de un patrón para agregar términos adicionales en VIM -- regex campo con vim campo con replace camp Relacionados El problema

How to replace the Nth occurence of a pattern to add extra terms in vim


3
vote

problema

Español

Tengo:

  elif paramo == 3:     fold_path = [Pk_Path+"ns_up", Pk_Path+"ns_up2", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2"]     CC_path = ["C_ns_up", "C_ns_up2", "C_fid", "C_ns_dw", "C_ns_dw2"]    

y me gustaría obtener:

  elif paramo == 3:     fold_path = [Pk_Path+"ns_up", Pk_Path+"ns_up2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2", Pk_Path+"ns_dw3"]     CC_path = ["C_ns_up", "C_ns_up2", "C_ns_up3", "C_fid", "C_ns_dw", "C_ns_dw2", "C_ns_dw3"]    

Para la primera línea, puedo agregar un elif paramo == 3: fold_path = [Pk_Path+"ns_up, "Pk_Path+"ns_up2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2"] CC_path = ["C_ns_up", "C_ns_up2", "C_fid", "C_ns_dw", "C_ns_dw2"] 2 adicional después de Pk_Path+"ns_up2" haciendo:

  :'<,'>s/, Pk_Path+(.{-})_up2"/, Pk_Path+1_up2", Pk_Path+1_up3"/g   

e inserciones de TI " ns_up3 ":

  elif paramo == 3:     fold_path = [Pk_Path+"ns_up, "Pk_Path+"ns_up2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2"]     CC_path = ["C_ns_up", "C_ns_up2", "C_fid", "C_ns_dw", "C_ns_dw2"]    

Pero para el otro término Pk_Path+"ns_dw3" , intenté hacer:

  :'<,'>s/, Pk_Path+(.{-})_dw2"/Pk_Path+1_dw2", Pk_Path+1_dw3"/g   

Pero esto produjo los resultados incorrectos:

  elif paramo == 3:     fold_path = [Pk_Path+"ns_up"Pk_Path+"ns_up2"Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw3"]     CC_path = ["C_ns_up", "C_ns_up2", "C_fid", "C_ns_dw", "C_ns_dw2"]   

No sé cómo indicar explícitamente que quiero insertar elif paramo == 3: fold_path = [Pk_Path+"ns_up", Pk_Path+"ns_up2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2", Pk_Path+"ns_dw3"] CC_path = ["C_ns_up", "C_ns_up2", "C_ns_up3", "C_fid", "C_ns_dw", "C_ns_dw2", "C_ns_dw3"] 0 Después del sexto elif paramo == 3: fold_path = [Pk_Path+"ns_up", Pk_Path+"ns_up2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2", Pk_Path+"ns_dw3"] CC_path = ["C_ns_up", "C_ns_up2", "C_ns_up3", "C_fid", "C_ns_dw", "C_ns_dw2", "C_ns_dw3"] 11111 cadena.

He probado el siguiente comando con elif paramo == 3: fold_path = [Pk_Path+"ns_up", Pk_Path+"ns_up2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2", Pk_Path+"ns_dw3"] CC_path = ["C_ns_up", "C_ns_up2", "C_ns_up3", "C_fid", "C_ns_dw", "C_ns_dw2", "C_ns_dw3"] 2 , no entiendo por qué esto no funciona:

  elif paramo == 3:     fold_path = [Pk_Path+"ns_up", Pk_Path+"ns_up2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2", Pk_Path+"ns_dw3"]     CC_path = ["C_ns_up", "C_ns_up2", "C_ns_up3", "C_fid", "C_ns_dw", "C_ns_dw2", "C_ns_dw3"]  3  

Parece que tomo la sexta ocurrencia de elif paramo == 3: fold_path = [Pk_Path+"ns_up", Pk_Path+"ns_up2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2", Pk_Path+"ns_dw3"] CC_path = ["C_ns_up", "C_ns_up2", "C_ns_up3", "C_fid", "C_ns_dw", "C_ns_dw2", "C_ns_dw3"] 4 CON elif paramo == 3: fold_path = [Pk_Path+"ns_up", Pk_Path+"ns_up2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2", Pk_Path+"ns_dw3"] CC_path = ["C_ns_up", "C_ns_up2", "C_ns_up3", "C_fid", "C_ns_dw", "C_ns_dw2", "C_ns_dw3"] 5 , luego agregue el patrón elif paramo == 3: fold_path = [Pk_Path+"ns_up, "Pk_Path+"ns_up2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2"] CC_path = ["C_ns_up", "C_ns_up2", "C_fid", "C_ns_dw", "C_ns_dw2"] 16 y el elif paramo == 3: fold_path = [Pk_Path+"ns_up", Pk_Path+"ns_up2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2", Pk_Path+"ns_dw3"] CC_path = ["C_ns_up", "C_ns_up2", "C_ns_up3", "C_fid", "C_ns_dw", "C_ns_dw2", "C_ns_dw3"] 7 cadena.

Actualización 1

Estoy cerca de la solución. Por solo la línea:

elif paramo == 3: fold_path = [Pk_Path+"ns_up", Pk_Path+"ns_up2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2", Pk_Path+"ns_dw3"] CC_path = ["C_ns_up", "C_ns_up2", "C_ns_up3", "C_fid", "C_ns_dw", "C_ns_dw2", "C_ns_dw3"] 8

Si quiero insertar simultáneamente elif paramo == 3: fold_path = [Pk_Path+"ns_up", Pk_Path+"ns_up2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2", Pk_Path+"ns_dw3"] CC_path = ["C_ns_up", "C_ns_up2", "C_ns_up3", "C_fid", "C_ns_dw", "C_ns_dw2", "C_ns_dw3"] 9 Después de Pk_Path+"ns_up3"0 Y Pk_Path+"ns_up3"1 Después de Pk_Path+"ns_up3"2 , creo que puede ser Una solución cerrada al resultado deseado:

(bajo VIM), haciendo:

Pk_Path+"ns_up3"3

IE, obtengo el primer patrón Pk_Path+"ns_up3"4 correspondiente a Pk_Path+"ns_up3"52525 y segundo patrón que representa Pk_Path+"ns_up3"6 o Pk_Path+"ns_up3"7 y le agrego el número Pk_Path+"ns_up3"8 . Por lo tanto, finalmente, los reemplaco por ejemplo, por ejemplo, el elif paramo == 3: fold_path = [Pk_Path+"ns_up, "Pk_Path+"ns_up2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2"] CC_path = ["C_ns_up", "C_ns_up2", "C_fid", "C_ns_dw", "C_ns_dw2"] 29 PLUS Pk_Path+"ns_up2"1 , Pk_Path+"ns_up2"2 (estaba haciendo Por la parte: Pk_Path+"ns_up2"3

Pero, lamentablemente, obtengo:

  Pk_Path+"ns_up2"4  

Como puede ver, Pk_Path+"ns_up2"5 ha desaparecido y Pk_Path+"ns_up2"6 como Pk_Path+"ns_up2"7 aparece 2 veces.

es posible usar Pk_Path+"ns_up2"8 Para insertar Pk_Path+"ns_up2"9 después de :'<,'>s/, Pk_Path+(.{-})_up2"/, Pk_Path+1_up2", Pk_Path+1_up3"/g 0 . En las palabras de orden, me gustaría insertar :'<,'>s/, Pk_Path+(.{-})_up2"/, Pk_Path+1_up2", Pk_Path+1_up3"/g 1 después de :'<,'>s/, Pk_Path+(.{-})_up2"/, Pk_Path+1_up2", Pk_Path+1_up3"/g 2 .

¿Dónde está mi error?

Actualización 2

Aquí está el comando correcto que he estado buscando en la publicación original:

  1. Expresión para procesar (entrada):

    fold_path = [PK_PATH + "NS_UP", PK_PATH + "NS_UP2", PK_PATH + "FID", PK_PATH + "NS_DW", PK_PATH + "NS_DW2"]

  2. comando aplicado:

    :% s / (pk_path + "[a-z] {2} _ [a-z] {2}) (2)" / 1 2, 13 "/ g

  3. resultado (salida):

:'<,'>s/, Pk_Path+(.{-})_up2"/, Pk_Path+1_up2", Pk_Path+1_up3"/g 3

Original en ingles

I have:

elif paramo == 3:     fold_path = [Pk_Path+"ns_up", Pk_Path+"ns_up2", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2"]     CC_path = ["C_ns_up", "C_ns_up2", "C_fid", "C_ns_dw", "C_ns_dw2"]  

and I would like to get:

elif paramo == 3:     fold_path = [Pk_Path+"ns_up", Pk_Path+"ns_up2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2", Pk_Path+"ns_dw3"]     CC_path = ["C_ns_up", "C_ns_up2", "C_ns_up3", "C_fid", "C_ns_dw", "C_ns_dw2", "C_ns_dw3"]  

For the first line I can add an extra Pk_Path+"ns_up3" after Pk_Path+"ns_up2" by doing:

:'<,'>s/, Pk_Path+\(.\{-}\)_up2"/, Pk_Path+\1_up2", Pk_Path+\1_up3"/g 

and it insertions "ns_up3":

elif paramo == 3:     fold_path = [Pk_Path+"ns_up, "Pk_Path+"ns_up2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2"]     CC_path = ["C_ns_up", "C_ns_up2", "C_fid", "C_ns_dw", "C_ns_dw2"]  

But for the other term Pk_Path+"ns_dw3", I tried to do:

:'<,'>s/, Pk_Path+\(.\{-}\)_dw2"/Pk_Path+\1_dw2", Pk_Path+\1_dw3"/g 

but this produced the wrong results:

elif paramo == 3:     fold_path = [Pk_Path+"ns_up"Pk_Path+"ns_up2"Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw3"]     CC_path = ["C_ns_up", "C_ns_up2", "C_fid", "C_ns_dw", "C_ns_dw2"] 

I don't know how to explicitly indicate that I want to insert Pk_Path+"ns_dw3" after the sixth Pk_Path string.

I tested the following command with \zs, I don't understand why this doesn't work:

:'<,'>s/\(\zsPk_Path\)\{6}+"\(.\{-}\)_dw2"/Pk_Path+\2_dw3"/g 

It seems that I take the sixth occurrence of Pk_Path with ns_dw2, then add the \2 pattern and the ns_dw3 string.

Update 1

I am close to the solution. For only the line:

fold_path = [Pk_Path+"ns_up", Pk_Path+"ns_up2", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2"]

If I want to insert simultaneously Pk_Path+"ns_up3" after Pk_Path+"ns_up2" and Pk_Path+"ns_dw3" after Pk_Path+"ns_dw2", I think following may be a solution closed to the wanted result:

(under vim), by doing:

%s/\(Pk_Path+".\{-}_\)\([a-z]\{2}\)2"/\1\22,\1\23"/g

i.e, I get the first pattern \1 corresponding to Pk_Path+"ns_and second pattern which represents upor dw and I add to it the number 2. So Finally, I replace them by for example the current Pk_Path+"ns_up2" by Pk_Path+"ns_up2" plus Pk_Path+"ns_up2",Pk_Path+"ns_up3" (I was doing this by the part : \1\22",\1\23"

but unfortunately, I obtain:

fold_path = [Pk_Path+"ns_up", Pk_Path+"ns_up",Pk_Path+"ns_up", Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw",Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw3"] 

As you can see, Pk_Path+"ns_up2" has disappeared and Pk_Path+"ns_up" like Pk_Path+"fid" appears 2 times.

Is it possible to use \1\22, \1\23 in order to insert \1\23 after \1\22. In order words, I would like to insert \1\23 after \1\22.

Where is my mistake?

Update 2

Here's the right command that I have been searching from the original post:

  1. Expression to process (input) :

    fold_path = [Pk_Path+"ns_up", Pk_Path+"ns_up2", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2"]

  2. Command applied :

    :%s/(Pk_Path+"[a-z]{2}_[a-z]{2})(2)"/\1\2, \13"/g

  3. Result (output) :

fold_path = [Pk_Path+"ns_up", Pk_Path+"ns_up2, Pk_Path+"ns_up3", Pk_Path+"fid", Pk_Path+"ns_dw", Pk_Path+"ns_dw2, Pk_Path+"ns_dw3"]

        
 
 

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

Bueno, no estoy seguro de si esto es lo que está buscando, pero aquí está mi intento:

  A8  

Pero si es esto que está intentando lograr una búsqueda simple y luego usar A9 (en una macro o menos) puede ser una solución más fácil. Un reemplazo puede no ser la mejor manera de insertar texto nuevo.

Actualizar: Realmente no estoy seguro de lo que desea lograr, pero simplemente para resolver el caso que pone en su actualización, es un caso bastante simple de una regla:

  00  

Desglose:

  01  

Luego, es solo una cuestión de insertar sus cadenas entre el Grupo 1 y 2 y entre el Grupo 2 y 3

 

Well I am not sure if this is what you are searching but here is my try:

:%s/\(Pk_Path+".\{-}",\=\s\=\)\{5}\zs\ze.*/, Pk_Path+"ns_dw3"/g  

But if it is this that you are trying to achieve a simple search and then using 5n (in a macro or so) may be an easier solution. A replace may not be the best way to insert new text.

Update: I really am unsure what you want to achieve but to just solve the case you put in your update, it is a rather simple case of a regex:

%s/\(.*Pk_Path+"ns_up2"\)\(.*Pk_Path+"ns_dw2"\)\(.*\)/\1, Pk_Path+"ns_up3"\2, Pk_Path+"ns_dw3"\3 

Breakdown:

\(.*Pk_Path+"ns_up2"\) " Capture everything up to "ns_up2" into group 1  \(.*Pk_Path+"ns_dw2"\) " Capture from "ns_up2" to "ns_dw2" into group 2 \(.*\)                 " Capture the rest into group 3 

Then it is just a matter of inserting your strings between group 1 and 2 and between group 2 and 3

 
 
         
         
3
 
vote

El comando 02 tiene un argumento opcional 9988777776623 ; Desafortunadamente, simplemente limita el reemplazo de una serie de líneas , y hace no coincidencia de conteo.

La única opción incorporada es suministrar la bandera ⊢t←⊃0⍴⊂v 0 0 0 24 ONFIRM, y responda las indicaciones con 0525 para simplemente reemplazar la 6ª coincidencia.

Alternativamente, puede implementar el conteo dentro del patrón, coincidiendo con los elementos anteriores con un ⊢t←⊃0⍴⊂v 0 0 0 26 , y luego inicie la coincidencia real con 07 . Pero eso es realmente incómodo para escribir, y necesita duplicar el patrón (por ejemplo, 08 ).

My PATTELSONTXT PLUGIRIN tiene (entre otros) un 09 Variante donde puede especificar directamente el recuento (como ⊢v←'abc',1 2,'de 3 4',5 abc 1 2 de 3 4 5 0 o ⊢v←'abc',1 2,'de 3 4',5 abc 1 2 de 3 4 5 1 o incluso repitiendo ⊢v←'abc',1 2,'de 3 4',5 abc 1 2 de 3 4 5 2 respuestas).

 

The :substitute command has an optional [count] argument; unfortunately, it just limits replacement to a number of lines, and does not count matches.

The only built-in option is supplying the confirm flag, and answer the prompts with nnnnnl to just replace the 6th match.

Alternatively, you can implement the counting inside the pattern, by matching the preceding elements with a \%(...\)\{5}, and then starting the actual match with :help /\zs. But that's really cumbersome to write, and you need to duplicate the pattern (e.g. \%(foo\)\{5}\zsfoo).

My PatternsOnText plugin has (among others) a :SubstituteSelected variant where you can directly specify the count (as 2,5 or 3-5 or even repeating y3nyyn answers).

 
 
         
         

Relacionados problema

0  REGEX para encontrar algunos valores que se pueden ubicar al azar en una cadena y ponerlos en un orden específico  ( Regex to find some values that can be randomly located in a string and put them ) 
Tengo un HTMLString que contiene múltiples etiquetas de entrada. Necesito identificar 3 grupos en esa cadena y reemplazar estos grupos capturados dentro de la...

2  ¿Cuál es la función de reemplazo en Python?  ( What is the replace function in python ) 
Quiero escribir un código Python que abra un archivo de texto y reemplazarme con una palabra que quiero enviarlo. ¿Me puede dar un ejemplo? Gracias . ...

1  Pase el documento HTML completo y reemplace partes específicas de IT automáticamente PHP  ( Parse whole html document and replace specific parts of it automatically php ) 
saludos, IV'E hizo una búsqueda rápida en las preguntas anteriores, pero no encontró una respuesta adecuada para mi pregunta. He creado una función que en...

113  ¿Cómo reemplazo la * primera instancia * de una cadena en .NET?  ( How do i replace the first instance of a string in net ) 
Quiero reemplazar la primera ocurrencia en una cadena dada. ¿Cómo puedo lograr esto en .NET? ...

6  Bloc de notas ++ Filtros de archivo  ( Notepad file filters ) 
Me preguntaba si era posible enumerar una exclusión dentro de los filtros de archivos en la funcionalidad "Buscar en archivos" de Blocad ++. Por ejemplo, lo...

0  Regex para reemplazar los últimos n delimitadores en el registro  ( Regex to replace the last n delimiters in record ) 
Tengo un archivo CSV con registros como este: ^Tablete Internet^|GoClever|^TAB I71^|^Tableta GoClever TAB I71, InfoTMIC iMAPx220 1GHz MKV, MOV, VOB, DAT, W...

0  ActionScript 2.0 y 3.0: Arrastre la imagen dinámica y no es reemplazada por otra  ( Actionscript 2 0 and 3 0 dragging dynamic image and not being replaced by anoth ) 
Tengo una función que muestra una imagen en la parte superior de un clip de película, pero cuando hace clic en otra imagen, por supuesto, reemplaza la imagen ...

0  Enlace de imagen Reemplace con otro enlace JS  ( Image link replace with other link js ) 
Tengo etiqueta HTML de IMG <img id="photo" src="//lh5.googleusercontent.com/-nt2iZrVQYZE/AAAAAAAAAAI/AAAAAAAAAEQ/z6WGWyexYpM/s512-c/photo.jpg"> para ca...

1  Subclasificación de UIView - Cómo bloquear el método de arrastre predeterminado  ( Uiview subclassing how to block default drawrect method ) 
Tengo la siguiente tarea. He establecido una UIVIE en InterfaceBuilder y lo puse en mi propia subclase de UIVIE, que uso Dibuja esta vista con esquinas redond...

10  ¿La búsqueda de VIM y reemplazar al disminuir la referencia?  ( Vim search and replace by decrementing back reference ) 
Dado el siguiente texto en VIM: [2] [3] [4] Quiero realizar una búsqueda y reemplazar y producir lo siguiente: [1] [2] [3] Sé cómo extraer los n...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos