我需要在BASh脚本中比较两行,忽略开头和结尾的空格,忽略EOL / EOF

时间:2016-08-29 12:20:54

标签: bash

目前我正在使用

$ STR1!= $ STR2

每个STR内部都有多条线。 这两行是从两个不同的文件中读取的,有时它会在行尾的EOL / EOF / Dot上失败。

我需要消除EOL / EOF / Dot-at-the-line-of-line(并且仅在结束时)。

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

比较允许在一组有限方式上不同的两个字符串的常用技术是对它们进行标准化 - 以执行消除这些差异的变换。例如,如果要对大小写进行规范化,则简单的转换是将两边都改为全大写或全小写;为了标准化前导空格,可以简单地消除它。

git fetch --depth=100

注意:

  • normalize() { s=${1//$'\r\n'/$'\n'} # change CRLFs to LFs s=${1%$'\n'} # eliminate any trailing LF # run other transforms (removing leading whitespace, trailing dots) line-by-line sed -E \ -e 's/^[[:space:]]+//' \ -e 's/[.]$//' \ <<<"$s" } # compare normalized strings if [[ "$(normalize "$STR1")" = "$(normalize "$STR2")" ]]; then echo "Strings are identical after normalization" else echo "Strings differ after normalization" fi 允许反斜杠转义用于表示文字;因此,$''是文字的CRLF。
  • $'\r\n'展开${var//foo/bar}$var的所有实例都替换为foo
  • 虽然使用bar会使大多数引号不必要,但在比较引用时,右侧确保将其视为文字字符串而不是glob表达式。
  • [[ ]]等同于GNUism sed -E(启用ERE语法),它还适用于现代BSD sed -r,包括MacOS X上的。{/ li>