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 cadaN
línea ext al espacio del patrón, haciendos
comando sustituto para2
nd ocurrencia solamente. Nosotrost
est si la sustitución tiene éxito o no. Si es así, nos encontramos con el bucle:2
, de lo contrario repite el ciclo conb1
. -
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.