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

时间:2017-09-06 17:17:15

标签: regex bash newline cat

如果我有以下代码:

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。这是有问题的,因为我希望我的脚本检测该正则表达式模式是否出现在内容的任何行上,而不仅仅是第一行。

3 个答案:

答案 0 :(得分:3)

你的情况:

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

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

它不匹配每一行开始。

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

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

答案 1 :(得分:2)

如果您想避免使用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

答案 2 :(得分:1)

如果您想测试 这样:

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

注释

  • 你不需要在bash正则表达式中删除斜杠
  • $(< file)是一种bash内置方式$(cat file)

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