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

0

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

ete
fonte

Respostas:

1

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.

Line breaks with sed

Nicole Hamilton
fonte
Você entendeu corretamente. Isso funcionará com os caracteres tab e newline como parte do find / replace? E, eu sou bastante novo / desconfortável com a linha de comando, por isso ajudaria ainda mais se você der comandos exatos para usar se o arquivo que eu quero executar o substitui em está localizado em C: \ Users \ Eric \ Documents \ unformatted .TXT
ete
Funcionaria com caracteres de tabulação nas cadeias de pesquisa ou substituição, mas não com caracteres de nova linha incorporados. (A correspondência de strings com novas linhas incorporadas é um requisito?) Substituir infile.txt com o seu caminho real, C:\Users\Eric\Documents\unformatted.txt.
Nicole Hamilton
Ok, substituindo newlines é necessário para muitos dos encontrar / substitui, mas eu poderia talvez contornar isso com textfixer.com/tools/remove-line-breaks.php Contanto que eu possa adicionar novas linhas com um localizar / substituir, existe uma maneira de fazer isso? E obrigado.
ete
As novas linhas estão lá simplesmente para envolver o texto em algumas margens convenientes ou porque cada linha é um registro separado?
Nicole Hamilton
As novas linhas a serem removidas fazem parte da formatação que desejo remover, não tenho certeza de qual delas se enquadra.
ete
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 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 centenas de 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.

Gruber
fonte
Esta parece ser uma abordagem razoável, o notepad ++ (meu editor de texto usual) parece ter as funções, mas não tenho certeza de como substituí-las corretamente (o modo estendido faz com que a substituição de coisas com newline funcione bem, mas não substitui novas linhas) .
ete
0

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

Karan
fonte