22

我在 Mac 上工作,有一些相当旧的文件。不同的文件是由不同的程序创建的,所以其中一些以 \r (Mac) 结尾,而一些以 \n (Unix) 结尾。我希望能够在这些文件上运行 diff、grep 等命令,但是具有 \r 的那些被视为一条巨线。是否有适用于所有换行符的diffgrep等版本?

ETA:我还希望它们成为 Unix 实用程序,所以我可以在脚本、Emacs 等中使用它们……

4

7 回答 7

12

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

编辑:刚刚意识到我第一次误读了这篇文章,而您实际上是在寻找一个适用于\r行尾的差异。我的建议是使用可以将文件转换为标准格式的翻转之类的东西来转换文件。\n

编辑 2:刚刚找到了一些看起来像你想要的东西 - Diff'nPatch

Diff'nPatch 是 GNU 'diff'、'patch' 和 'cmp' 实用程序的 Macintosh 端口。它可以让您比较和查找两个文件或文件夹之间的差异,整理两个文件,生成各种格式的差异(普通、上下文、unidiff 等)、应用补丁、逐字节比较文件。它可以处理任何类型的行尾(mac、unix 或 windows)

于 2009-02-12T22:33:17.120 回答
9

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

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

或者

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

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

于 2009-02-12T23:44:38.133 回答
8

与OS X v10.7 (Lion)捆绑的 diff 实用程序有一个选项 'strip-trailing-cr' 可以满足您的需要。你像这样使用它:

diff -cpt a.c b.c --strip-trailing-cr
于 2011-10-10T13:07:07.837 回答
3

PhpStorm 的 diff 视图的“忽略空格”可以正常工作。它会自动忽略回车/EOL/换行/what-have-you 中的差异。你可以把时间浪费在摆弄神秘的 Unix 命令或其他东西上,或者你可以得到一些真正有效的东西并继续生活。

  • 在 OS X v10.8 (Mountain Lion) 上使用上述任何解决方案均失败(包括标记为正确答案的解决方案)。“Diff-npatch”的所有下载链接都失败了。(我确实找到了http://webperso.easyconnect.fr/bdesgraupes/tools.html,但我真的不喜欢不得不求助于无法从命令行调用并因此与我可能使用的任何 IDE 或版本控制系统工具,例如BBEditSourcetree或 SmartSVN ——顺便说一句,所有这些工具都未能通过其内置的 diff 工具忽略换行符。

是的,我的换行符是 \r,但那又怎样?啊!如果软件太愚蠢而无法意识到 \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 'is' LTYPE or 'changed'”?这是否意味着“可能被替换”?如果是这样,那么为什么引号、括号等中没有“GFMT”?由于没有给出例子,所以没有办法知道;文档的措辞完全模棱两可。"GFMT may contain" 是什么意思?“包含”是否意味着替换首字母缩写词 GFMT 的文本可能包含它?没有一个明确的例子,它是完全没用的。

如果你想让手册页变得如此神秘和模棱两可,以至于对于基本上不知道如何使用该软件的人来说毫无用处,为什么还要费心编写手册页呢?那时,它不是手册。这只是一个快速参考页面,供编写该软件的人使用,以便他们记住如何使用它。我猜他们认为如果你想知道它的实际作用,你只会阅读源代码本身。

我的时间很宝贵。我宁愿花钱买一个真正能正常工作并有适当文档的软件。

因为这些都失败了:

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

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

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

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

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

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

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

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

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

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

就此而言,如果它们是 \n 字符,则在添加 \n 字符时也会失败。

其中 test.phtml ==

酒吧

和rest.html ==

富吧

“diff”命令总是给你类似的东西:


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

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

... 失败!

于 2014-03-03T21:34:31.800 回答
2

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

于 2009-02-12T23:13:37.117 回答
0

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

1:做一个差异并只列出文件名

diff -r -q dir1/ dir2/

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

3:做一个常规的差异

缺点包括:

  • 不太健壮,容易出错
  • 如果你有很多文件,更多的工作
于 2010-11-22T11:19:09.523 回答
-1

这对我有用:

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

我在 OS X 上,有来自 OS X 和 Windows 的混合文件。

信用: http: //www.codealpha.net/514/diff-and-ignoring-spaces-and-end-of-lines-unix-dos-eol/

于 2014-02-06T16:36:54.333 回答