如何不敏感地检查文件相似度大小写

How to check file similarity case in-sensitively

想法是判断两个给定文件是否具有完全相同的内容,但不考虑大小写差异。

例如如果 file1 是 alpha 并且 file2 是 AlphA,那么脚本 file1 file2 给出 'Same'.

如何让脚本不区分大小写?

#!/bin/bash
if cmp   >/dev/null  ; then
   echo "Mostly the same."
else
   echo "Different."
fi

也许:

file1=$(cat  | tr '[:upper:]' '[:lower:]')
file2=$(cat  | tr '[:upper:]' '[:lower:]')

if [ "$file1" = "$file2" ]; then
    echo "same"
else
    echo "different"
fi

cmp 使用 byte-by-byte 比较,因此您必须先进行自己的大小写转换:

if cmp -s <(tr '[:upper:]' '[:lower:]' <"") <(tr '[:upper:]' '[:lower:]' <""); then
  echo "Mostly the same."
else
  echo "Different."
fi
  • -s 使 cmp 无声 - 即,如果存在差异,则不会打印出来。

  • <(...) 是一个 process substitution,笼统地说,它使命令的输出显示为一个临时的、有效的 self-deleting 文件;由于进程替换使用管道,因此使用它们 memory-efficient 甚至可以工作 具有大输出集。

  • tr '[:upper:]' '[:lower:]' 对通过标准输入提供的字符进行 locale-aware 从大写到小写的转换,导致 all-lowercase 输出。

  • 还要注意 </code> 和 <code> 是如何 double-quoted 以确保使用它们的值 as-is(double-quoting 保护来自 shell expansions 的值)。

如果文件足够小,你可以做的更简单。

#!/bin/bash
f1="$(<"")"
f2="$(<"")"
if
  [[ "${f1^^}" = "${f2^^}" ]]
then
  echo "Mostly the same."
else
 echo "Different."
fi