Supongamos que tengo un archivo que contiene múltiples ocurrencias de StringA y StringB. Quiero reemplazar todas las apariciones de StringA con StringB, y (simultáneamente) todas las apariciones de StringB con StringA.
Ahora mismo estoy haciendo algo como
cat file.txt | sed 's/StringB/StringC/g' | sed 's/StringA/StringB/g' | sed 's/StringC/StringA/g'
El problema con este enfoque es que supone que StringC no ocurre en el archivo. Si bien esto no es un problema en la práctica, esta solución todavía se siente sucia, es decir, se siente como una oportunidad para aprender más magia de Unix. :)

sed: can't read s/StringB/StringA/g: No such file or directory. Parece-e t PATTERNque no se entiende bien.-eantes del segundoscomando. He arreglado mi respuesta.Creo que su enfoque está bien, solo debe usar algo más en lugar de una cadena, algo que no puede ocurrir en una línea (en el espacio del patrón). El mejor candidato es el
\newline.Normalmente, ninguna línea de entrada en el espacio del patrón contendrá ese carácter, por lo que, para intercambiar todas las apariciones
THISyTHATen un archivo, puede ejecutar:o, si su sed también es compatible
\ncon el RHS:fuente
sedsoporte admite ciertos escapes o no se vuelve mucho menos importante si prepara algunas macros de antemano. Me gustaset /THIS /THAT "$(printf \\n/)"; sed "s/$2/\\$4g;s/$3$2/g;s/\\n$3/g", un poco estúpido aquí, sin duda, pero tiene mucho más sentido que en otras ocasiones, especialmente para clases de char y similares.sed, la bifurcación constante con la bifurcaciónees una pesadilla kinduva. En una nota diferente: he estado jugandopastedurante todo un día. Hice un analizador de opciones,columnalgo así. Simplemente genera guiones para las cadenas de entrada y las cosas juntas.Creo que es perfectamente válido usar una cadena "nonce" para intercambiar dos palabras. Si desea una solución más general, puede hacer algo como:
Que rinde
Tenga en cuenta que necesita las dos sustituciones adicionales aquí para evitar el reemplazo
x_xsi tiene cadenas "x_x". Pero incluso eso todavía parece más simple que laawksolución para mí.fuente
_, uno necesita ajustar el_sí mismo (elegir otro carácter) o la cadena problemática (ejecutars/_/__/gde antemano, parece mejor). Su solución, tal como está, no se puede aplicar a ciegas para intercambiar cadenas arbitrarias.s/_/__/gantemano. Tal vez solo muestre un caso de prueba que falla._, por ejemplo, reemplazandoy_ouconme. Sí, es verdad, uno tiene que ser consciente de eso y ponerloy__ouen la expresión. Un script que toma el reemplazo como parámetros de entrada también debe tenerlo en cuenta.