如何进行字符串比较忽略空格?

如何进行字符串比较忽略空格?

如何比较两个字符串但忽略空格?我正在做以下事情:

if [ "$a" == "$b" ]; then
   echo ok
fi

但似乎并不匹配。我已经打印了“a”和“b”是什么,它们是相同的。不过,他们似乎使用了不同的换行符。

答案1

从技术上讲,要忽略所有空格,您可以传递两个字符串tr

[ "$(echo "$a" | tr -d '[:space:]')" = "$(echo "$b" | tr -d '[:space:]')" ]

但是,通过这种方式,在比较之前所有空格都会被删除,因此例如"a b""ab"将测试相等。我不确定这是否可取。您可以调整tr过滤器来执行您需要的操作。例如,要仅删除所有风格的换行符,您可以这样做tr -d '\n\r'

答案2

在 bash 中,您可以使用参数扩展语法获取删除了某些字符的变量值(或者更一般地替换模式的出现)。

if [[ "${a//[$' \t\n\r']/}" == "${b//[$' \t\n\r']/}" ]]; then
  echo ok
fi

如果问题是它们“使用不同的换行符”,则可能意味着其中之一来自 Windows 文件。 Windows 行在$'\r换行符 ( ) 之前有一个额外的 CR(bash 语法中的回车符) $'\n'。如果你有多行字符串,你可以只去掉 CR 字符:

if [[ "${a//$'\r'/}" == "${b//$'\r'/}" ]]; then
  echo ok
fi

如果变量是单行字符串,那么麻烦的 CR 将出现在末尾,您可以使用后缀剥离语法:

if [[ "${a%$'\r'}" == "${b%$'\r'}" ]]; then
  echo ok
fi

如果您需要简单的 sh 格式,那么(较小的)困难是输入 CR 字符。

cr=$(printf '\r')
if [[ "${a%$cr}" == "${b%$cr}" ]]; then
  echo ok
fi

相关内容