线端不可知差异?

问题描述 投票:20回答:7

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

ETA:我也希望它们成为Unix实用程序,因此我可以在脚本,Emacs等中使用它们...

macos unix diff utilities
7个回答
9
投票

正如杰伊所说,Diff'nPatch似乎是您想要的。另外,您也可以在单个命令中将所有以'\ n'结尾的'\ r'行尾转换为单个命令,如下所示:

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

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

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


12
投票

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

EDIT:刚刚意识到我是第一次误读了这篇文章,而您实际上正在寻找一种适用于\r行尾的差异。我的建议是使用flip这样的文件来转换文件,这些文件可以将文件转换为\n标准格式。

EDIT 2:刚刚找到了您想要的东西-Diff'nPatch

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


8
投票

与OSX Lion捆绑在一起的diff实用程序具有所需的选项'strip-trailing-cr'。您可以这样使用它:

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

1
投票

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


1
投票

PHPStorm的差异视图的“忽略空白” 有效。它会自动忽略回车/ EOL /换行/有什么需要之间的差异。您可以浪费时间摆弄神秘的unix命令或其他任何东西,或者您可以得到一些切实可行的东西并不断前进。

  • 使用上述任何解决方案都无法在Mountain Lion上使用(包括标记为正确答案的解决方案)。 “ Diff-npatch”的所有下载链接均失败。 (我确实找到了http://webperso.easyconnect.fr/bdesgraupes/tools.html,但我真的不喜欢不得不使用无法从命令行调用的差异工具,因此无法与我可能使用的任何IDE或VCS工具(如BBEdit)集成的想法, SourceTree或SmartSVN-顺便说一句,所有这些都无法通过其内置的diff工具忽略换行符。
  • 是,我的换行符是\ r,那又如何呢?啊!如果该软件太愚蠢而无法意识到\ r == \ n,那么我将使用is

足够聪明的其他软件。

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
我对这段文章一无所知。什么是“输入”?是两个文件,还是“至”文件还是“从”文件?什么是“相似”? “ GFMT'是'LTYPE或'已更改'”在句子中的“是”是什么意思?这是否意味着“可能被替换”?如果是这样,为什么在引号或方括号等中不包含“ GFMT”?由于没有给出示例,因此无法知道。该文档的措辞完全模棱两可。 “ GFMT可能包含”是什么意思? “包含”是否意味着替换缩写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 ==

foo

bar

和rest.html ==

foobar

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


* 1,2 **

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

...失败!

我使用了以下快速修复方法,但有缺点(请参见下文):

1

:做一个比较,只列出文件名diff -r -q dir1/ dir2/

2

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

3

:进行常规差异缺点包括:

    较不健壮,容易出错
  • 如果文件很多,则需要更多工作
  • 这对我有用:

    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/

  • 0
    投票
    我使用了以下快速修复方法,但有缺点(请参见下文):

    -1
    投票
    这对我有用:
    最新问题
    © www.soinside.com 2019 - 2024. All rights reserved.