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 PATTERN
que no se entiende bien.-e
antes del segundos
comando. 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
\n
ewline.Normalmente, ninguna línea de entrada en el espacio del patrón contendrá ese carácter, por lo que, para intercambiar todas las apariciones
THIS
yTHAT
en un archivo, puede ejecutar:o, si su sed también es compatible
\n
con el RHS:fuente
sed
soporte 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óne
es una pesadilla kinduva. En una nota diferente: he estado jugandopaste
durante todo un día. Hice un analizador de opciones,column
algo 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_x
si tiene cadenas "x_x". Pero incluso eso todavía parece más simple que laawk
solución para mí.fuente
_
, uno necesita ajustar el_
sí mismo (elegir otro carácter) o la cadena problemática (ejecutars/_/__/g
de antemano, parece mejor). Su solución, tal como está, no se puede aplicar a ciegas para intercambiar cadenas arbitrarias.s/_/__/g
antemano. Tal vez solo muestre un caso de prueba que falla._
, por ejemplo, reemplazandoy_ou
conme
. Sí, es verdad, uno tiene que ser consciente de eso y ponerloy__ou
en la expresión. Un script que toma el reemplazo como parámetros de entrada también debe tenerlo en cuenta.