Por favor corrija-me se eu entendi mal a sua pergunta mas a partir da sua descrição, eu entendo que você tem um único (possivelmente muito grande) documento Ascii .txt
e que quando você diz que as mudanças devem ser aplicadas "em ordem ", você quer dizer que gostaria de fazer a primeira pesquisa / substituição no documento inteiro, depois a segunda pesquisa / substituição no documento inteiro e assim por diante.
Talvez a solução mais fácil seja criar um arquivo (chamá-lo sedscript
) contendo um script sed
, uma linha por alteração. Aqui está um exemplo. O g
no final significa "global", ou seja, substitua todas as ocorrências, não apenas a primeira ocorrência em qualquer linha.
s/foo/bar/g
s/hello/world/g
s/yellow/green/g
:
Você pode executar isso da seguinte maneira:
sed -f sedscript infile.txt > outfile.txt
Se você estiver satisfeito com a saída, basta mv
voltar para a parte superior da entrada:
mv outfile.txt infile.txt
Se você estiver em uma máquina Linux, isso vem com sed
. Se você estiver no Windows, poderá obter sed
(e mv
) com o Cygwin ou com o meu próprio Shell Hamilton C (incluindo a versão gratuita ).
Adicionado:
Como você também gostaria de considerar as correspondências que terminam com as extremidades da linha, então, sim, uma maneira de fazer isso é substituir todas as extremidades da linha por um caractere ou string especial, fazer as operações de pesquisa / substituição pretendidas e a linha termina quando você terminar.
A maneira mais fácil de fazer as conversões de fim de linha com sed
está em estágios separados de pipeline. No meu exemplo aqui, eu substituí as seqüências de \r\n
por #
, mas poderia ser uma string completamente arbitrária (mas é mais fácil se você puder usar um único caractere).
sed 's/\r\n/#/' infile.txt | s -f sedscript | sed 's/#/\r\n/g' > outfile.txt
Dentro do seu arquivo sedscript
, você procuraria / substituiria nas duas variações, com um espaço entre as palavras ou o que quer que você tenha substituído.
Se você for capaz de usar apenas um único caractere e não precisar de uma sequência de caracteres multicaracteres para garantir a exclusividade, use \(...\)
notation para criar uma expressão regular marcada em torno de [...]
lista de caracteres que podem separar uma palavra. Qualquer coisa que corresponda pode ser inserida na string de substituição como .
Aqui está uma captura de tela de como isso pode funcionar.