将输出与正则表达式进行比较时,如何在 bash 中保留换行符?

How can I preserve line breaks in bash when comparing output to regex?

如果我有以下代码:

if [[ "$(cat myfile)" =~ ^scripts\/.* ]]; then
  echo YES
else
  echo NO
fi

并且 "myfile" 包含以下内容:

hot/warm
scripts/whatever
cold/cool

当我 运行 我的代码是 "NO" 时的结果,但我希望它是 YES。

如果我通过重新排序内容来更改 "myfile",以便 "scripts/whatever" 排在第一位,如下所示:

scripts/whatever
hot/warm
cold/cool

然后我运行我的脚本的结果确实是YES。这是有问题的,因为我希望我的脚本检测该正则表达式模式是否出现在内容的任何行上,而不仅仅是第一行。

您的情况:

[[ "$(cat myfile)" =~ ^scripts\/.* ]]; 

正在检查完整文件数据(您使用 cat myfile 命令提取的)的正则表达式,因此只有当文件内容以 scripts/ 开头时才会匹配。

不是每行开头都匹配。

为此,您可以将 grepgit diff 命令一起使用(请参阅下面的评论):

if git diff | grep -q '^scripts/'; then
  echo 'YES'
else
  echo 'NO'
fi

如果您想避免使用 grep,您可以使用 while-read-do 循环,如下所示。

cat myfile | while read LINE; do
  if [[ "$LINE" =~ ^scripts\/.* ]]; then
    echo YES
  else
    echo NO
  fi
done

我 运行 在您发布的文件的两个版本上执行此操作并获得以下输出(与您发布的顺序相同):

YES
NO
NO

NO
YES
NO

唯一的问题是它会在文件中每行打印一次,所以如果您只想打印一次,您可能想在 YES 条件下使用 break

如果要测试"scripts"出现在字符串的开头 出现在[=开头19=]一行,然后这样做:

[[ "$(< myfile)" =~ (^|$'\n')scripts/.* ]]

备注

  • 您不需要转义 bash 正则表达式中的斜杠
  • $(< file) 是一种 bash 内置方式来执行 $(cat file)

在这种情况下,使用 grep 作为 anubhava 演示可能更清晰、更快速。