Cómo reemplazar la tercera aparición de la cadena en el archivo usando el sed
comando.
Ejemplo:
Cambie solo la tercera aparición de is
a us
en el archivo.
Mi archivo de entrada contiene:
hai this is linux.
hai this is unix.
hai this is mac.
hai this is unchanged.
Espero que la salida sea:
hai this is linux.
hai thus is unix.
hai this is mac.
hai this is unchanged.
text-processing
sed
perl
Suresh Kumar
fuente
fuente
sed
No es la herramienta adecuada para el trabajo.Respuestas:
Es mucho más fácil hacerlo con
perl
.Para cambiar la 3 rd ocurrencia:
Para cambiar cada 3ª aparición:
fuente
Cuando la cadena de reemplazo se produce solo una vez por línea, puede combinar diferentes utilidades.
Cuando la entrada está en el archivo "input" y está reemplazando "is" por "us", puede usar
fuente
is
por línea.El siguiente script (que usa la sintaxis de GNU
sed
) se puede usar para la edición in situ, no para la salida porque detiene las líneas de impresión después de la sustitución deseada:Si te gusta la decisión de choroba , puedes modificarla arriba para
que genera todas las líneas
O debe colocar todas las líneas en el espacio del patrón (en la memoria, así que tenga cuidado con la limitación de tamaño) y realice la sustitución
fuente
Puede usar
sed
para eso si anteriormente las nuevas líneas se reemplazan por cualquier otro carácter, por ejemplo:Y lo mismo con puro (GNU)
sed
:(
sed
reemplazo de nueva línea robado descaradamente de /programming//a/1252191/4488514 )fuente
sed
sintaxis específica, que también podría utilizarsed -z 's/is/us/3'
.-z
debe ser una característica completamente nueva, miGNU sed version 4.2.1
no sabe nada acerca de esta opción.\x0
paso.Esa parte
sed
simplemente lleva un recuento deis
ocurrencias de una línea a la siguiente. Debe manejar de manera confiable tantosis
es por línea como le arroje, y no necesita almacenar las líneas antiguas mientras lo hace; solo retiene un solo carácter de nueva línea por cadais
cosa que encuentra, que no es parte de otra palabra.El resultado es que modificará solo la tercera aparición en un archivo, y llevará los recuentos por línea. Entonces, si un archivo se ve así:
... se imprimirá ...
Primero maneja los casos de borde insertando un espacio en la cabeza y la cola de cada línea. Esto hace que los límites de las palabras sean un poco más fáciles de determinar.
A continuación, busca valores válidos
is
insertando una\n
línea de e antes de que todas las aparicionesis
que preceden inmediatamente a cero o un signo de puntuación seguido de un espacio. Hace otra pasada y elimina todos los\n
ewlines que están precedidos inmediatamente por un carácter que no es espacio. Estos marcadores dejados coincidiránis.
yis
no,this
o no?is
.A continuación, reúne cada marcador en la cola de la cadena: para cada
\ni
coincidencia en una línea, agrega una\n
línea de flecha a la cola de la cadena y la reemplaza coni
ou
. Si hay 3\n
ewlines en una fila reunida en la cola de la cadena, entonces usa la u, de lo contrario, la i. La primera vez que se usa au también es la última: el reemplazo activa un bucle infinito que se reduce aget line, print line, get line, print line,
y así sucesivamente.Al final de cada ciclo de bucle de prueba, limpia los espacios insertados, imprime solo hasta la primera línea nueva en el espacio del patrón y vuelve a funcionar.
Agregaré un
l
comando ook en la parte superior del bucle como:... y eche un vistazo a lo que hace, ya que funciona con esta entrada:
... así que esto es lo que hace:
Tiene más sentido quizás con más
is
es por línea:Eso es prácticamente lo mismo, pero escrito con POSIX BRE y manejo de argumentos rudimentarios.
... consigue ...
... y si habilito
${dbg}
:... podemos verlo iterar ...
fuente
Aquí hay una solución lógica que usa
sed
ytr
debe escribirse en un script para que funcione. El siguiente código reemplaza cada tercera aparición de la palabra especificada en elsed
comando. Reemplacei=3
coni=n
para que esto funcione para cualquieran
.Código:
Por qué esto funciona:
Supongamos que el archivo de texto es
a b b b b a c a d a b b b a b e b z b s b a b
.Cuando n = 2: queremos reemplazar cada segunda aparición de
b
.a b b b b a c a d a b b b a b e b z b s b a b
. . ^ . ^ . . . . . . ^ . . ^ . . . ^ . ^ . ^
Cuando n = 3: queremos reemplazar cada tercera aparición de
b
.a b b b b a c a d a b b b a b e b z b s b a b
. . . ^ . . . . . . . ^ . . . . ^ . . . . . ^
Cuando n = 4: queremos reemplazar cada tercera aparición de
b
.fuente