我想比较两个文件,这样行尾和空格就会被忽略。也就是说,我希望 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/2877364和https://stackoverflow.com/a/4642213/2877364!