线端不可知差异?

时间:2009-02-12 22:30:32

标签: macos unix diff utilities

我正在使用一些相当旧的文件。不同的程序创建了不同的文件,因此其中一些以\ r(mac)结尾,一些以\ n(unix)结尾。我希望能够在这些文件上运行diff,grep等命令,但将\ r \ n的命令视为一个巨行。有没有人知道一个版本的diff,grep等可以正常使用所有新行?

ETA:我也希望它们是unix实用程序,所以我可以在脚本,emacs等中使用它们......

7 个答案:

答案 0 :(得分:11)

如果您使用diff -w,它将忽略文件中的空格,这可能足以满足您的需求。

编辑:刚刚意识到我第一次误读帖子,你实际上正在寻找一个可以与\r行结尾一起使用的差异。我的建议是将文件转换为flip,可以将文件转换为\n标准格式。

编辑2 :刚刚找到了你想要的东西 - Diff'nPatch

  

Diff'nPatch是Macintosh的端口   GNU'diff','patch'和'cmp'   公用事业。它可以让你比较和   找到两个文件之间的差异或   文件夹,整理两个文件,生成   各种格式的差异(正常,   上下文,unidiff等),申请   补丁,逐字节比较文件。   它可以处理任何类型的行结尾   (mac,unix或windows)

答案 1 :(得分:8)

正如杰伊所说,Diff'nPatch似乎正是你要找的。或者,您可以在单个命令中转换'\ n'中所有'\ r'行结尾,如下所示:

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

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

(您可能希望在后一种情况下以某种方式过滤文件列表,或者它将应用于所有子目录中的所有文件。)

答案 2 :(得分:7)

与OSX Lion捆绑在一起的diff实用程序有一个选项'strip-trailing-cr'可以执行您想要的操作。你这样使用它:

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

答案 3 :(得分:1)

dos2unix命令可能有助于首先将文件转换为一致的格式。我相信它几乎可用于您能想到的每个平台,并且可以同时运行大量文件。我相信有一个可用于mac的软件包。

答案 4 :(得分:1)

PHPStorm的差异视图“忽略空白”正常工作。它会自动忽略回车/ EOL /换行/有什么你的差异。你可以浪费你的时间摆弄奥术unix命令或其他什么,或者你可以得到一些真正有效的东西并继续前进。

  • 使用上述任何一种解决方案都失败了Mountain Lion(包括标记为正确答案的解决方案)。 “Diff-npatch”的所有下载链接都失败了。 (我确实找到http://webperso.easyconnect.fr/bdesgraupes/tools.html但我真的不喜欢不得不求助于使用不能从命令行调用的diff工具,因此与我可能正在使用的任何IDE或VCS工具集成,例如BBEdit,SourceTree或SmartSVN - 所有这些,BTW,都没有用内置的差异工具忽略换行。

是的,我的新行是\ r \ n,但是那又怎样? Arrr!如果软件太愚蠢而无法实现\ r == \ n那么我只会使用 足够智能的不同软件。

PHPStorm是唯一拥有“正常工作”差异工具的软件 - 这就是我期望的Mac软件。我希望Mac软件正常工作。我使用的是Mac,所以我可以完成我的工作而不是每次都学习神秘的终端命令,这些命令几乎都记录不清,期望你只是理解命令应该如何格式化而没有任何明确的例子,所以你永远不知道是否你做错了,或者命令根本不起作用就像所有其他坏软件一样。以“man diff”为例:

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

好的,所以读过这篇文章,我不知道这意味着什么。没有使用它的例子。什么是“RE”?它没有在任何地方说。

然后就是这个宝石:

  --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

我对这段经文毫无意义。什么是“输入”?它既是文件,还是“to”文件还是仅仅是“from”文件?什么是“相似”指的是什么? “是”在句子中意味着什么,“GFMT”是'LTYPE还是'改变'“?这是否意味着“可以被替换”?如果是这样,为什么报价或括号中没有“GFMT”等?既然没有给出例子,就没有办法知道;文档的措辞完全不明确。 “GFMT可能含有什么”......是什么意思? “包含”是否意味着替换首字母缩略词GFMT的文本可能包含?没有一个明确的例子,它就完全没用了。

为什么甚至懒得写一个手册页如果你要让它变得如此神秘和模棱两可,对于那些还不知道如何使用该软件的人来说,这基本上是没用的?那时,它不是手册;它只是编写软件的人的快速参考页面,因此他们可以记住如何使用它。我猜他们假设你只是想知道源代码本身,如果你想知道它实际上做了什么。

我的时间很宝贵。我宁愿只是付钱买一块实际工作正常且有适当文档的软件。

因为这些都失败了:

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

...未能忽略\ r \ n字符。

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

...未能忽略\ r \ n字符。

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

...未能忽略\ r \ n字符。

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

...未能忽略\ r \ n字符。

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

...未能忽略\ r \ n字符。

如果它们是\ n字符,那么当添加\ n字符时它也会失败。

test.phtml ==

  

FOO

     

和rest.html ==

  

foobar的

“diff”命令总是给你这样的东西:

  
     

* 1,2 ** ! foo! bar \文件末尾没有换行符

     

--- 1 ----! foob​​ar \文件末尾没有换行符

......失败!

答案 5 :(得分:0)

我使用了以下快速修复程序,它有缺点(见下文):

1 :执行差异并仅列出文件名

diff -r -q dir1/ dir2/

2 :使用所使用的编辑器打开并保存每个列出的文件,这将更改行尾。

3 :做一个常规差异

缺点包括:

  • 不太健壮,容易出错
  • 如果您有大量文件,则需要做更多工作

答案 6 :(得分:-1)

这对我有用:

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

我在OSX上,并且有来自OSX和windows的混合文件。 信用:http://www.codealpha.net/514/diff-and-ignoring-spaces-and-end-of-lines-unix-dos-eol/