cómo emular "replace abb a" con un sed?

Estoy tratando de emular un command de reemploop que intercambia dos caracteres, con un script sed, pero la opción obvia:

sed -e 's/a/b/g' -e 's/b/a/g' 

no funciona ¿Puedes indicarme cómo hacerlo correctamente?

Yo usaría translate command tr eg.

 tr ab ba < input_file 

Si solo desea replace caracteres individuales, no cadenas más largas, use

 sed -e 'y/ab/ba/' 

o el command tr equivalente de la respuesta de X Tian. Para cadenas arbitrarias, tienes que trabajar más duro:

Si hay algún carácter que ciertamente no ocurre en la input, como # (incluso un caracter de control lo hará), puede usar algo como

 sed -e 's/a/#/g;s/b/a/g;s/#/b/g;' 

Alternativamente, puedes hacer algunos trucos con el prefijo:

 sed -e ' s/a/xa/g; s/b/xb/g; s/xa/yb/g; s/xb/ya/g; s/ya/a/g; s/yb/b/g; ' 

es decir: prefija cada a y b con x (lo que significa: aún no modificado), reemplace xa por yb y viceversa (donde y significa: modificado), y elimine todos los prefijos.

Si tienes un personaje extra, puedes hacer la sugerencia de Uwe.

Si realmente solo necesita replace un solo carácter y no necesariamente necesita sed , use tr como lo sugiere XTian.

Si no necesitas sed y puedes replace secuencias más largas sin necesidad de un personaje adicional, puedes ir con algo como eso:

 perl -le '%ex=(a=>"b",b=>"a"); $keys=join("|",keys(%ex)); $text="abba"; $text=~s/$keys/$ex{$&}/eg; print $text' 

o

 ruby -e 'ex={"a"=>"b","b"=>"a"}; puts "abba".gsub(/(#{ex.keys.join("|")})/,ex)'