忽略 eol 和空格的差异

忽略 eol 和空格的差异

我想比较两个文件,这样行尾和空格就会被忽略。也就是说,我希望 diff 不会发现 d1.txt 和 d2.txt 之间有什么区别:

$ cat d1.txt                                                                    
test1                                                                           

test2                                                                           

test3                                                                           

 test4                                                                          
$ cat d2.txt                                                                    
test1test2test3test4               

因为某些原因,

差异-d-w-a --strip-trailing-cr d1.txt d2.txt

不起作用。任何帮助都值得感激。

答案1

diff比较线, 看man diff

diff - compare files line by line

忽略空格意味着foo bar将匹配foobar 如果在同一行。由于 d1.txt 中的模式跨越多行,因此文件将始终不同。我实际上没有阅读源代码,但我猜想它的diff工作原理如下:

for each line number X in file1;
    line1 = line X from file1
    line2= line X from file2
    If line1 is equal to line2 the do something
    else do something else

file1 的第一行与 file2 的第一行不同,因此报告了差异。如果您确实想检查文件是否包含完全相同的非空白字符,您可以尝试以下方法:

diff <(perl -ne 's/\s*//xg; print' d1.txt) <(perl -ne 's/\s*/g; print' d2.txt)

答案2

这是一个我认为可以满足你要求的 shell 脚本。它不如 @terdon 的单行脚本酷,但它确实显示了不同的字符。

#!/bin/bash
f1=`mktemp`
f2=`mktemp`
result=`mktemp`

# Do the comparison letter-by-letter
cat "$1" | tr -d '[:space:]' > "$f1"
cat "$2" | tr -d '[:space:]' > "$f2"
cmp -l "$f1" "$f2" > "$result"
retval=$?

# Print the results as characters rather than octal values
if [ "$retval" -ne 0 ]; then
  while read -a vals; do
    echo -e "${vals[0]}" '\0'"${vals[1]}" '\0'"${vals[2]}"
  done < "$result"
fi

rm -f "$f1" "$f2" "$result"
exit $retval

谢谢https://stackoverflow.com/a/14267178/2877364https://stackoverflow.com/a/4642213/2877364

相关内容