GNU/Linux >> Tutoriales Linux >  >> Linux

¿Reemplazar el patrón después de encontrar la enésima coincidencia en cada línea?

Esta pregunta ya tiene respuestas aquí :sed:eliminar todas las apariciones de una cadena excepto la primera

(4 respuestas)
Cerrado hace 2 años.

Tengo un archivo que contiene líneas:

india;austria;japan;chile
china;US;nigeria;mexico;russia

Quiero reemplazar todas las apariciones de punto y coma en cada línea con, p. ;NEW; , pero a partir de la segunda ocurrencia solamente. El resultado debería verse así:

india;austria;NEW;japan;NEW;chile
china;US;NEW;nigeria;NEW;mexico;NEW;russia

Probé esto con gsub, pero reemplaza todas las ocurrencias:
awk '/;/{gsub(/;/,";NEW;") }{print}'

Respuesta aceptada:

El awk la solución es mucho más larga, pero es más fácil hacerla genérica:

awk -F; '{for(i=1;i<NF;i++)printf"%s;%s",$i,(i>=2)?"NEW;":"";print$NF}' replacefile

Es posible hacerlo con sed también, haciendo un bucle con la t comando y siempre reemplazando el segundo separador (o el que desee) en alguna marca temporal (generalmente n ):

sed ':b;s/;/n/2;tb;s/n/;NEW;/g' replacefile

Linux
  1. Uso de Sed para buscar y reemplazar una línea entre rangos de patrones

  2. ¿Imprimir línea anterior después de una coincidencia de patrón usando Sed?

  3. ¿Encuentra el número de línea que contiene el patrón usando el delimitador Regex personalizado?

  4. ¿Devolver solo la parte de una línea después de un patrón coincidente?

  5. Sed:¿Insertar texto después del enésimo carácter antes o después de una cadena determinada?

Sustitución de cadena en Bash

Elimine los espacios en blanco en cada comienzo de línea del archivo, usando bash

sed para insertar solo en la primera coincidencia

El concepto de 'Espacio de espera' y 'Espacio de patrón' en sed

sed - insertar línea después de X líneas después del partido

Mostrar coincidencia encontrada o no usando awk