Estou procurando uma maneira de substituir seqüências de caracteres de espaço reservado em um arquivo de modelo por valores concretos, por ferramentas comuns do Unix (bash, sed, awk, talvez perl). É importante que a substituição seja feita em uma única passagem, ou seja, o que já foi digitalizado / substituído não deve ser considerado para outra substituição. Por exemplo, essas duas tentativas falham:
echo "AB" | awk '{gsub("A","B");gsub("B","A");print}'
>> AA
echo "AB" | sed 's/A/B/g;s/B/A/g'
>> AA
O resultado correto neste caso é obviamente BA.
Em geral, a solução deve ser equivalente à varredura da entrada da esquerda para a direita para uma correspondência mais longa com uma das seqüências de substituição especificadas e, para cada correspondência, executando uma substituição e continuando a partir desse ponto na entrada (nenhuma das entrada já lida nem as substituições realizadas devem ser consideradas para correspondências). Na verdade, os detalhes não importam, apenas que os resultados da substituição nunca são considerados para outra substituição, no todo ou em parte.
NOTA Estou procurando apenas soluções genéricas corretas. Não proponha soluções que falhem para determinadas entradas (arquivos de entrada, pesquisa e substituição de pares), por mais improváveis que pareçam.
tr AB BA
.