GNU/Linux >> Tutoriales Linux >  >> FreeBSD

Freebsd – Bsd Sed:¿Reemplazar solo la enésima aparición de un patrón?

Uso de BSD sed;

¿Cómo puedo realizar la siguiente sustitución?:

Antes:

hello hello hello
hello hello hello

Después:

hello world hello
hello hello hello

En otras palabras; ¿Cómo puedo reemplazar solo the N th ocurrencia de un patrón?
(O en este caso; el 2 segundo ocurrencia de un patrón?)

Respuesta aceptada:

Con cualquier POSIX sed :

$ sed -e'/hello/{' -e:1 -e'$!N;s/hello/world/2;t2' -eb1 -e\} -e:2 -en\;b2 <file
hello world hello
hello hello hello
  • Después del primer partido /hello/ , nos encontramos con un bucle.

  • Bucle interior :1 , leemos cada N línea ext al espacio del patrón, haciendo s comando sustituto para 2 nd ocurrencia solamente. Nosotros t est si la sustitución tiene éxito o no. Si es así, nos encontramos con el bucle :2 , de lo contrario repite el ciclo con b1 .

  • Bucle interior :2 , solo imprimimos líneas restantes hasta el final del archivo.

Tenga en cuenta que este enfoque almacenará todas las cosas entre dos hola en el espacio patrón. Será un problema con archivos grandes, cuando el primero y el segundo están lejos el uno del otro.


FreeBSD
  1. Reemplace las comillas tipográficas con el comando sed de Linux

  2. ¿Solo devolver la cadena coincidente en Sed?

  3. ¿Mantener solo la primera línea de cada secuencia de líneas consecutivas que coincidan con un patrón?

  4. Sed:¿Imprimir solo la primera aparición de una coincidencia de patrón?

  5. Freebsd:¿de dónde viene Mac Os X?

Los 20 mejores comandos sed para usar

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

¿Cómo encontrar la última ocurrencia del patrón e imprimir todas las líneas después de la última ocurrencia?

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

Usar sed para reemplazar entre un patrón específico

Reemplazo de SED en varias líneas