Supongamos que tengo una cadena 'abbc' y quiero reemplazar:
- ab -> bc
- bc -> ab
Si intento dos reemplazos, el resultado no es lo que quiero:
echo 'abbc' | sed 's/ab/bc/g;s/bc/ab/g'
abab
Entonces, ¿qué comando sed puedo usar para reemplazar como se muestra a continuación?
echo abbc | sed SED_COMMAND
bcab
EDITAR : En realidad, el texto podría tener más de 2 patrones y no sé cuántos reemplazos necesitaré. Dado que hubo una respuesta que decía que sed
es un editor de flujo y sus reemplazos son codiciosos, creo que necesitaré usar un lenguaje de script para eso.
g
bandera de amboss///
comandos y eso funcionará.ab
obc
en la entrada original?Respuestas:
Tal vez algo como esto:
Reemplace
~
con un carácter que sepa que no estará en la cadena.fuente
\x0
para~~
.g
necesario y qué hace?g
es para global: reemplaza todas las instancias del patrón en cada línea, en lugar de solo la primera (que es el comportamiento predeterminado).Siempre uso múltiples declaraciones con "-e"
$ sed -e 's:AND:\n&:g' -e 's:GROUP BY:\n&:g' -e 's:UNION:\n&:g' -e 's:FROM:\n&:g' file > readable.sql
Esto agregará un '\ n' antes de todos los AND, GROUP BY, UNION y FROM, mientras que '&' significa la cadena coincidente y '\ n &' significa que desea reemplazar la cadena coincidente con un '\ n' antes del 'coincidente '
fuente
Aquí hay una variación en la respuesta de ooga que funciona para múltiples pares de búsqueda y reemplazo sin tener que verificar cómo se pueden reutilizar los valores:
Aquí hay un ejemplo:
antes de:
después:
Tenga en cuenta que
\b
denota los límites de palabras, que es lo que impide que________
interfieran con la búsqueda (estoy usando GNU sed 4.2.2 en Ubuntu). Si no está utilizando una búsqueda de límites de palabras, entonces esta técnica puede no funcionar.También tenga en cuenta que esto da los mismos resultados que eliminar
s/________//g
y agregar&& sed -i 's/________//g' path_to_your_files/*.txt
al final del comando, pero no requiere especificar la ruta dos veces.Una variación general de esto sería usar
\x0
o_\x0_
reemplazar________
si sabe que no aparecen valores nulos en sus archivos, como sugirió jthill .fuente
sed 's/ab/xy/' | sed 's/cd/ab/' .....
)sed
es un editor de stream. Busca y reemplaza con avidez. La única forma de hacer lo que solicitó es usar un patrón de sustitución intermedio y volver a cambiarlo al final.echo 'abcd' | sed -e 's/ab/xy/;s/cd/ab/;s/xy/cd/'
fuente
Esto podría funcionar para usted (GNU sed):
Esto utiliza una tabla de búsqueda que se prepara y se mantiene en el espacio de espera (HS) y luego se agrega a cada línea. Un marcador único (en este caso
\n
) se antepone al comienzo de la línea y se utiliza como un método para avanzar en la búsqueda a lo largo de la línea. Una vez que el marcador llega al final de la línea, el proceso finaliza y se imprime la tabla de búsqueda y los marcadores que se descartan.NB La tabla de búsqueda se prepara desde el principio y se
:
elige un segundo marcador único (en este caso ) para no chocar con las cadenas de sustitución.Con algunos comentarios:
La tabla funciona así:
fuente
Puede ser un enfoque más simple para la ocurrencia de un solo patrón que puede probar de la siguiente manera: echo 'abbc' | sed 's / ab / bc /; s / bc / ab / 2'
Mi salida:
Para múltiples ocurrencias de patrón:
Ejemplo
Espero que esto ayude !!
fuente
Tcl tiene un incorporado para esto
Esto funciona caminando la secuencia de un carácter a la vez haciendo comparaciones de cadenas comenzando en la posición actual.
En perl:
fuente
Aquí hay una
awk
base de oogassed
fuente