Reemplazar líneas después de un número determinado de coincidencias en líneas separadas con AWK

Reemplazar líneas después de un número determinado de coincidencias en líneas separadas con AWK

Actualmente estoy usando AWK para buscar y reemplazar una parte de una cadena después de las tres primeras apariciones de un patrón. La cadena tiene el formato siguiente: func(tempID="39849235",count='12');y hay muchas de estas cadenas en el archivo, como se muestra a continuación:

func(tempID="39849235",count='12');
func(tempID="39849235",count='12');
func(tempID="39849235",count='12');
func(tempID="39849235",count='12');
func(tempID="39849235",count='12');
func(tempID="39849235",count='12');

Usandoeste enlace, pude encontrar un método para usar AWK para buscar y reemplazar las primeras tres instancias de la cadena. Lo cambié a lo que necesitaba que hiciera y a continuación se muestra un fragmento de mi script:

id=12349876
awk -v id="$id" 'BEGIN {matches=0}
     matches < 3 && /.*tempID.*/ { sub(/tempID=.[0-9]+./,"tempID=\""id"\""); matches++ }
     { print $0 }' filName.py >filName.py.changed

El objetivo del código anterior es hacer coincidir cualquier línea que contenga tempID y reemplazar el número asignado a tempID con un valor contenido en una variable denominada $id. Buscar y reemplazar funciona bien, pero ahora quiero reemplazar las instancias 4 a 9 con un número diferente. Probé el siguiente método, pero solo reemplazó las primeras 5 instancias de tempID:

id2=39843237
awk -v id2="$id2" 'BEGIN {matches=4}
     matches < 9 && /.*tempID.*/ { sub(/tempID=.[0-9]+./,"tempID=\""id2"\""); matches++ }
     { print $0 }' filName.py >filName.py.changed

¿Hay otra forma de implementar esto para reemplazar ese rango de valores? No tiene que ser con AWK, puede ser con sed o cualquier otra utilidad de Linux. Además, la solución no necesariamente tiene que terminar en un punto determinado y se permite reemplazar todas las instancias después de la tercera línea, pero si hay una solución que pueda hacer esto, sería una ventaja.

Respuesta1

Tu matches=4y matches < 9quieres decir "suponga que ya hubo 4 coincidencias, actúe hasta que haya 9 en total". Por eso se reemplazan las primeras 5 instancias. Debe comenzar desde 0 como antes y luego incluir el límite inferior en la lógica:

id2=39843237
awk -v id2="$id2" 'BEGIN {matches=0}
 matches >=3 && matches < 9 && /.*tempID.*/ { sub(/tempID=.[0-9]+./,"tempID=\""id2"\"") }
 /.*tempID.*/ { matches++ }
 { print $0 }' filName.py >filName.py.changed

Tenga en cuenta que debe realizar el reemplazo de acuerdo con el valor de matchespero debe aumentar este valor cada vez que ocurre una coincidencia. Su código original reemplazó el texto y aumentó el valor en un bloque. Cuando no hubo reemplazo por matchesser demasiado alto, el valor no se aumentó más, pero ya no importó. Ahora no puedes salirte con la tuya con este simple enfoque. Cuando no haya reemplazo por matchesestardemasiado baja, aún necesita aumentar el valor si se encuentra una cadena coincidente.

De ahí los dos {}bloques con condiciones separadas.

información relacionada