Pergunta

Eu estou trabalhando em um mac, com alguns arquivos bastante antigos. arquivos diferentes foram criados por diferentes programas, por isso alguns deles terminam com \ r (Mac) e alguns com \ n (unix). Eu quero ser capaz de executar comandos como diff, grep, etc sobre estes arquivos, mas os que têm \ r são tratados como uma linha gigante. Alguém sabe de uma versão do diff, grep, etc que vai funcionar corretamente com todas as novas linhas?

ETA: Eu também gostaria que eles sejam utilitários Unix para que eu possa usá-los em scripts, emacs, etc ...

Foi útil?

Solução

Como Jay disse, Diff'nPatch parece que você está procurando. Alternativamente, você pode converter todos os '\ r' terminações sua linha em '\ n' em um único comando como este:

sed -ie 's/\r/\n/' filename

ou

find . | xargs -n1 sed -ie 's/\r/\n/'

(Você pode querer filtrar a lista de arquivos de alguma forma, no último caso, ou ele vai ser aplicada a todos os arquivos em todos os subdiretórios.)

Outras dicas

Se você usar diff -w ele irá ignorar espaços em branco nos arquivos, que é provavelmente suficiente para suas necessidades.

Editar : só percebi que eu descaracterizou o cargo pela primeira vez e você está realmente à procura de um diff que irá trabalhar com terminações de linha \r. Minha sugestão seria a de converter os arquivos com algo como aleta que pode converter os arquivos para um formato padrão \n.

EDIT 2 : Apenas encontrou algo que se parece com o que você quer - Diff'nPatch :

Diff'nPatch é uma porta para o Macintosh do GNU 'dif', 'adesivo' e 'cmp' Serviços de utilidade pública. Ele permite que você comparar e encontrar diferenças entre dois arquivos ou pastas, agrupar dois arquivos, gerar Diffs em vários formatos (normais, contexto, unidiff, etc), aplicar manchas, arquivos comparar byte por byte. Ele pode lidar com qualquer tipo de fins de linha (Mac, unix ou windows)

O diff empacotado com OSX Lion tem uma opção '-arrastando strip-cr' que faz isso que você quer. Você usá-lo assim:

diff -cpt a.c b.c --strip-trailing-cr

O comando dos2unix poderia ser útil na conversão de seus arquivos para um formato consistente em primeiro lugar. Eu acredito que ele está disponível para praticamente todas as plataformas que você pode pensar e pode ser executado em lotes de arquivos de uma vez. Eu creio que há um pacote disponível para Mac.

de vista diff do PHPStorm "ignorar espaços em branco" simplesmente funciona . Ele automaticamente ignora as diferenças no retorno de carro / EOL / nova linha / o que-ter-você. Você pode desperdiçar seu tempo brincando com arcanos comandos UNIX ou qualquer outra coisa, ou você pode apenas obter algo que realmente funciona e seguir em frente com a vida.

  • O uso de qualquer das soluções acima mencionadas falharam em Mountain Lion (incluindo aquele marcado como a resposta correta). Todos os links de download para "Diff-npatch" falhou. (Eu fiz encontrar http://webperso.easyconnect.fr/bdesgraupes/tools.html mas eu realmente não gosto da idéia de ter que recorrer ao uso de uma ferramenta de comparação que não pode ser chamado a partir da linha de comando e, assim, integrado com qualquer ferramenta IDE ou VCS I pode estar usando, como BBEdit, SourceTree, ou SmartSVN - tudo dos quais, BTW, não conseguiu ignorar novas linhas com a sua built-in diff ferramenta.

Sim, meu novas linhas são \ r, mas e daí? Arrr! Se o software é demasiado estúpido para perceber que \ r == \ n então eu só vou usar software diferente que é bastante inteligente.

PHPStorm foi o único software que tinha uma ferramenta de comparação que "simplesmente funcionou" - que é o que eu espero software Mac para fazer. Espero software Mac para apenas trabalho . Eu uso um Mac para que eu possa fazer o meu trabalho em vez de aprender comandos do terminal arcanas em cada turno, que são quase todos mal documentada, esperando que você simplesmente entender como os comandos devem ser formatados sem quaisquer exemplos claros, então você nunca sabe se você está fazendo errado ou se o comando simplesmente não trabalho , assim como todos os outros softwares mal. Veja este exemplo de "homem diff":

   -I RE  --ignore-matching-lines=RE
          Ignore changes whose lines all match RE.

OK, então depois de ler isso, eu não tenho idéia o que isso significa. Não há exemplo de seu uso. O que é "RE"? Ela não diz em qualquer lugar.

Depois, há esta jóia:

  --GTYPE-group-format=GFMT
          Similar, but format GTYPE input groups with GFMT.

   --line-format=LFMT
          Similar, but format all input lines with LFMT.

   --LTYPE-line-format=LFMT
          Similar, but format LTYPE input lines with LFMT.

   LTYPE is `old', `new', or `unchanged'.
          GTYPE is LTYPE or `changed'.

          GFMT may contain:

   %<     lines from FILE1

   %>     lines from FILE2

   %=     lines common to FILE1 and FILE2

   %[-][WIDTH][.[PREC]]{doxX}LETTER
          printf-style spec for LETTER

          LETTERs are as follows for new group, lower case for old group:

   F      first line number

   L      last line number

   N      number of lines = L-F+1

   E      F-1

   M      L+1

          LFMT may contain:

   %L     contents of line

   %l     contents of line, excluding any trailing newline

   %[-][WIDTH][.[PREC]]{doxX}n
          printf-style spec for input line number

          Either GFMT or LFMT may contain:

   %%     %

   %c'C'  the single character C

   %c'\OOO'
          the character with octal code OOO

Eu poderia fazer sem qualquer sentido desta passagem. Qual é o "input"? É ambos os arquivos ou apenas o "para" arquivo ou apenas o "de" arquivo? O que é "similar" se referindo? O que significa "é" média na frase, "GFMT 'é' TIPON ou` mudou '"? Será que isso significa "pode ??ser substituído por"? Se sim, então por que não é "GFMT" entre aspas ou parênteses etc.? Uma vez que nenhum exemplo é dado, não há nenhuma maneira de saber; a formulação da documentação é totalmente ambíguo. O que significa "GFMT pode conter" ... média? Será que "contém" significa que o texto substituindo a sigla GFMT pode conter isso? Sem um claro exemplo é completamente inútil.

Por que sequer se preocuparam em escrever uma página de homem, se você está indo para torná-lo tão enigmática e ambígua é inútil para quem já não sabe como usar o software, basicamente? Nesse ponto, não é um manual; é apenas uma página de referência rápida para os caras que escreveram o software para que eles possam se lembrar de como usá-lo. Eu acho que eles assumem que você só vai ler o código-fonte em si, se você quer saber o que ele realmente faz.

Meu tempo é valioso. Eu prefiro apenas pagar o dinheiro para ter um pedaço de software que realmente funciona corretamente e tem a documentação adequada.

Porque todos estes falhou:

 diff -d --strip-trailing-cr --ignore-all-space --from-file=rest.phtml test.phtml

... não conseguiu ignorar \ caracteres r.

 diff -wd --strip-trailing-cr --ignore-all-space --from-file=rest.phtml test.phtml

... não conseguiu ignorar \ caracteres r.

 diff -wd --suppress-common-lines --strip-trailing-cr --ignore-all-space --from-file=rest.phtml test.phtml

... não conseguiu ignorar \ caracteres r.

 diff -wd test.phtml rest.phtml --suppress-common-lines --strip-trailing-cr --ignore-all-space

... não conseguiu ignorar \ caracteres r.

 diff -awd test.phtml rest.phtml --suppress-common-lines --strip-trailing-cr --ignore-all-space

... não conseguiu ignorar \ caracteres r.

Para que o assunto se fossem \ n personagens também falhou quando o \ n caracteres são adicionados.

Onde test.phtml ==

foo

bar

e rest.html ==

foobar

O comando "diff" dá-lhe sempre algo como:


* 1,2 ** ! foo! bar \ Sem newline no final do arquivo

--- 1 ----! foobar \ N nova linha no final do arquivo

... falhar!

Eu usei o seguinte solução rápida, que tem desvantagens (veja abaixo):

1 : Faça uma comparação e lista apenas os nomes de arquivos

diff -r -q dir1/ dir2/

2 :. Abrir e salvar todos os arquivos listados com o editor que foi usado, isso vai mudar as quebras de linha

3 : Faça uma diff normal

As desvantagens incluem:

  • menos robusto, propenso a erros
  • mais trabalho se você tiver lotes de arquivos

Isso funcionou para mim:

diff -r --ignore-all-space dir1/ dir2/

Eu estou em OSX, e têm arquivos mistos de OSX e Windows. Crédito: http: //www.codealpha.net/514/diff-and-ignoring-spaces-and-end-of-lines-unix-dos-eol/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top