¿Hay alguna manera de decir sed
que reemplace el patrón en cada segundo caso? ¿O al menos en cada segunda línea? (Claro que es posible con un script, pero me preguntaba si sed
puedo hacerlo).
Editar
encontré
sed -e "s/pattern/replacement/g;n"
Pero reemplazó cada primera ocurrencia, no la segunda.
Ejemplo
Fichero de entrada:
I have a pattern in each line
Also the second line has the pattern
Another pattern here
And -- you guess it -- a pattern
Salida deseada:
I have a pattern in each line
Also the second line has the replacement
Another pattern here
And -- you guess it -- a replacement
sed -e 'n;s/2004-2009/6e législature/g'
que resolvió mi problema.Reemplazará la segunda aparición en cada línea que tenga el patrón.
si tienes GNU
sed
:Comenzando desde la línea uno
1
, la línea después de que se agregará al espacio del patrónN
, els
comando reemplazará la segunda aparición del patrón. luegosed
moverá dos líneas hacia abajo~2
y repetirá.fuente
code
(sed '1 ~ 2s / patrón / reemplazo /')La interpretación simple:
En la primera línea que contiene al menos una aparición de PATTERN, desea ignorarlo e imprimir la línea tal como está. En la segunda línea que contiene al menos una aparición de PATTERN, desea reemplazar la primera instancia de PATTERN con REPLACEMENT. En la tercera línea que contiene al menos una aparición de PATTERN, desea imprimir la línea tal como está. En la cuarta línea que contiene al menos una aparición de PATTERN, desea reemplazar la primera instancia de PATTERN con REPLACEMENT. Y así. Las líneas que no coinciden con PATTERN deben imprimirse sin cambios.
Esto se puede hacer fácilmente con Sed así:
O, con menos espacios en blanco y una etiqueta más corta:
EDITAR: Acabo de releer la pregunta y vi la interpretación más difícil:
Reemplace la segunda aparición de PATTERN en todo el documento con REPLACEMENT, ya sea que ocurra en la misma línea que la primera aparición o no. Deje las primeras y terceras ocurrencias sin alteraciones. Etc.
Creo que esto también se puede hacer con Sed, aunque es MUCHO más complicado y creo que depende de la expresión regular que se use. Intentaré resolver algo y publicarlo, pero dejaré que esta respuesta se mantenga con la versión simple anterior por ahora.
fuente
t
est con unq
uit y tome información como,{ sed '...'; cat; } <input
para un solo reemplazoEstabas muy cerca, solo salta la primera línea:
¿Por qué debería
awk
ser la mejor herramienta en este caso?fuente
Un patrón de símbolo dentro de una línea: sed 's / (a [^ a] *) a / \ 1c / g'
Cada segundo patrón (solo puede aparecer una coincidencia de patrón por línea. Si aparecen dos o más coincidencias por línea, solo se reemplazará la segunda)
fuente