Se StringB
e StringA
não puderem aparecer na mesma linha de entrada, você poderá informar ao sed para realizar a substituição de uma maneira, e tentar somente de outra maneira se não houver ocorrências da primeira seqüência pesquisada.
<file.txt sed -e 's/StringA/StringB/g' -e t -e 's/StringB/StringA/g'
No caso geral, não acho que haja um método fácil no sed. A propósito, observe que a especificação é ambígua se StringA
e StringB
puderem se sobrepor. Aqui está uma solução Perl, que substitui a ocorrência mais à esquerda de qualquer string e se repete.
<file.txt perl -pe 'BEGIN {%r = ("StringA" => "StringB", "StringB" => "StringA")}
s/(StringA|StringB)/$r{$1}/ge'
Se você quiser ficar com as ferramentas POSIX, o awk é o caminho a percorrer. Awk não tem um primitivo para substituições gerais parametrizadas, então você precisa fazer o seu próprio.
<file.txt awk '{
while (match($0, /StringA|StringB/)) {
printf "%s", substr($0, 1, RSTART-1);
$0 = substr($0, RSTART);
printf "%s", /^StringA/ ? "StringB" : "StringA";
$0 = substr($0, 1+RLENGTH)
}
print
}'