【问题标题】:Compare/Diff two files with different line terminators比较/比较具有不同行终止符的两个文件
【发布时间】:2015-07-04 22:18:50
【问题描述】:

我有两个文本文件我想确保是相同的,问题是file1(SELECT_20150210.txt)是在windows平台上生成的,而file2(sel.txt)是在mac上生成的,所以这两个文件具有不同的行终止字符,即使它们看起来相同:

第一行:

Eriks-MacBook-Air:hftdump erik$ head -n 1 sel.txt
SystemState 0x04    25  03:03:48.800    O
Eriks-MacBook-Air:hftdump erik$ head -n 1 SELECT_20150210.txt
SystemState 0x04    25  03:03:48.800    O

cmp 说他们是不同的:

Eriks-MacBook-Air:hftdump erik$ cmp sel.txt SELECT_20150210.txt
sel.txt SELECT_20150210.txt differ: char 35, line 1

但只是终止字符不同:

Eriks-MacBook-Air:hftdump erik$ head -n 1 SELECT_20150210.txt | hexdump -C
00000000  53 79 73 74 65 6d 53 74  61 74 65 09 30 78 30 34  |SystemState.0x04|
00000010  09 32 35 09 30 33 3a 30  33 3a 34 38 2e 38 30 30  |.25.03:03:48.800|
00000020  09 4f 0d 0a                                       |.O..|
00000024
Eriks-MacBook-Air:hftdump erik$ head -n 1 sel.txt | hexdump -C
00000000  53 79 73 74 65 6d 53 74  61 74 65 09 30 78 30 34  |SystemState.0x04|
00000010  09 32 35 09 30 33 3a 30  33 3a 34 38 2e 38 30 30  |.25.03:03:48.800|
00000020  09 4f 0a                                          |.O.|
00000023

那么有没有办法 cmpdiff 这两个文件并告诉 cmp 忽略不同的行终止字符?谢谢

【问题讨论】:

标签: linux macos bash


【解决方案1】:

假设:您不想更改原始文件的行尾

为避免创建临时文件,您可以使用process substitution:

diff my_unix_file <(dos2unix < my_dos_file)
diff my_unix_file <(sed 's/\r//' my_dos_file)
diff my_unix_file <(tr -d '\r' < my_dos_file)

更新(评论转换为答案):感谢anishsane

【讨论】:

  • @anubhava:使用trawksedetc选择任何dos2unix方法
  • 当你只想使用filename时不要使用&lt;(cat filename) :P diff my_unix_file &lt;(tr -d '\r' &lt; my_dos_file)
  • @anishsane:谢谢(记住这一点)。答案已更新。
【解决方案2】:

在 OSX 上你可以使用这个diff:

diff osx-file.txt <(tr -d '\r' < win-file.txt)

tr -d '\r' &lt; win-file.txt 将从 win-file.txt 中删除 r

【讨论】:

    猜你喜欢
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2021-06-16
    • 1970-01-01
    • 2013-01-08
    • 2017-06-18
    相关资源
    最近更新 更多