Por favor, corrija-me se eu entendi mal a sua pergunta, mas a partir de sua descrição, eu entendo que significa que você tem um único (possivelmente muito grande) Ascii .txt
documento e que quando você diz que as alterações devem ser aplicadas "em ordem", você quer dizer que você gostaria de fazer a primeira pesquisa / substituição em todo o documento, em seguida, a segunda pesquisa / substituição em todo o documento e assim por diante.
Talvez a solução mais fácil seja criar um arquivo (chamá-lo sedscript
) contendo um sed
script, uma linha por alteração. Aqui está um exemplo. o g
no final significa "global", isto é, substitua todas as ocorrências, não apenas a primeira ocorrência em qualquer linha dada.
s/foo/bar/g
s/hello/world/g
s/yellow/green/g
:
Você pode então executar isso da seguinte maneira:
sed -f sedscript infile.txt > outfile.txt
Se você está satisfeito com a saída, simplesmente mv
volta por cima da entrada:
mv outfile.txt infile.txt
Se você está em uma máquina Linux, isso vem com sed
. Se você está no Windows, você pode obter sed
(e mv
) com qualquer Cygwin ou o meu Concha Hamilton C (incluindo o 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 cadeia especial, fazer as operações de pesquisa / substituição pretendidas e encerrar a linha de volta quando estiver pronto.
A maneira mais fácil de fazer as conversões de fim de linha com sed
está em estágios de pipeline separados. No meu exemplo aqui, eu substituí o \r\n
seqüências com um #
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 sedscript
arquivo, 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ê é capaz de usar apenas um único caractere e não precisa de uma string multicharacter para garantir exclusividade, você pode usar \(...\)
notação para criar um tagged regular expression por aí [...]
lista de caracteres que podem separar uma palavra. O que quer que corresponda pode ser inserido na string de substituição \1
.
Aqui está uma captura de tela como isso pode funcionar.