Como posso executar um grande número de encontrar / substituir diferentes?

0

Eu tenho várias vezes um documento de texto que eu preciso aplicar várias centenas de encontrar / substitui em. Estes achados / substituições não seguem um padrão que regex pode ser razoavelmente aplicado, e precisa ser aplicado em ordem. Anteriormente, recorri a fazê-las manualmente depois de muita pesquisa, mas existe uma maneira melhor?

    
por ete 12.03.2013 / 12:53

3 respostas

1

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.

    
por 12.03.2013 / 16:17
0

Normalmente, os programas são bons em aplicar uma única combinação de pesquisa e substituição a vários arquivos, e não o contrário.

Para mim, parece que a sua melhor aposta é usar um programa de processador de texto com recursos de macro. Em seguida, você pode escrever uma função que executa a substituição e, em seguida, chamá-la cem vezes com as cadeias de caracteres de pesquisa / substituição. Processadores de texto habilitados para macro são, por exemplo, o LibreOffice Writer e o Microsoft Word.

    
por 12.03.2013 / 13:08
0

FART deve ser capaz de ajudá-lo. Basta criar um arquivo de lote com várias chamadas FART e, se desejar substituir novas linhas ( \r\n ), ative o uso da sintaxe no estilo C por meio dos parâmetros -C ou --c-style .

    
por 13.03.2013 / 01:44