usando tr de coreutils para windows

1

Eu tenho que transformar o conteúdo do arquivo de \ para \\ no Windows no script. Então eu peguei Coreutils e tentei usar tr \ \\ < file_in > file_out no Windows CMD, mas \ in file_out remainde \ em vez de ser convertido em \. Arquivo contém LFs (\ n) e CRLFs (\ r \ n), mas eles precisam permanecer inalterados. Existe uma maneira de usar tr para realizar a mudança que tentei fazer?

    
por R. Nec 27.04.2015 / 11:02

3 respostas

0

Como outros observaram, tr apenas transforma um único caractere em outro caractere único.

Você pode usar meu utilitário de processamento de texto de expressão regular JREPL.BAT para facilmente e eficientemente resolver seu problema. É um script puro (JScript / batch híbrido) que é executado nativamente em qualquer máquina Windows do XP em diante.

jrepl "\" "\" /l /f file.txt /o -

O acima irá escrever cada linha com \ r \ n terminadores.

Se você precisar preservar os terminadores originais de linha, use a opção /M de várias linhas

jrepl "\" "\" /l /m /f file.txt /o -

Os comandos acima usam a opção /L literal. Sem /L , o comando interpreta o termo de pesquisa como uma expressão regular, então você precisaria:

jrepl "\" "\" /m /f file.txt /o -

Use call jrepl se você usar o comando em um script em lote.

Curiosamente, o JREPL possui uma opção /T translate que funciona de maneira muito semelhante ao comando unix tr . Mas não é de nenhuma utilidade na sua situação.

Use jrepl /? para ver a documentação incorporada. Canalize a saída para more se quiser limitar a saída a uma tela por vez. Eu não preciso de more porque minha janela de console está configurada com um grande buffer de saída para que eu possa rolar para cima para ver a saída anterior.

    
por 27.04.2015 / 14:11
0

Tr traduz apenas um único caractere. Para substituí-lo por mais de um caractere, é necessário usar o sed. Pode ser encontrado no GnuWin32 - port of linux tools para Windows. Para substituir \ por \ , você deve usar f.e.

  cat file | sed "s_\_\\_g" 

O s é para modo separado, g significa global - no padrão sed substitui apenas a primeira ocorrência na linha. \\ em vez de \ e \\\\ de \\ porque a barra invertida deve ter escapado usando barras invertidas adicionais.

    
por 27.04.2015 / 12:51
0

tr lida com caracteres individuais; na verdade, não lida com strings, embora haja sobreposição.

você pode substituir várias ocorrências de um único caractere, com uma ocorrência (Substituindo \ por \ ), uma opção que ele chama de "encolher", mas que você deseja o contrário. Em teoria, poder-se-ia dizer que isso envolve um caráter individual, mas, no entanto, ele não pode fazer isso, não tem opção de dar a ele um caráter e declarar quantas vezes ele deve aparecer. Tem essa opção de caracteres de redução, mas não uma opção de repetição de caracteres.

Você pode usar sed, você pode achar que precisa usar aspas simples em vez de aspas duplas

 $ echo '\' | sed 's_\_\\_g'
\

ou sed 's/a/b/g' filename

A sintaxe

com sed com seu comando s, é sed "s/find/replace/" e colocar um modificador g no final garantirá que ele não pare apenas no primeiro, ele substitui todas as ocorrências. sed 's/find/replace/g' Normalmente, as pessoas usam / Você pode usar _por exemplo, s_a_b_g Você não coloca um / depois do g.

Quanto a \r\n e \n , essa linha sed não a afetará. \r\n não é armazenado com uma barra invertida real, ele é armazenado com o binário para os códigos ascii que ele representa. 13 para \r e 10 para \n olhar para uma tabela ascii e você veria isso.

    
por 27.04.2015 / 11:53