在将输出与正则拨号比较时,如何保留bash的线路断裂



如果我有以下代码:

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

和" myfile"包含以下内容:

hot/warm
scripts/whatever
cold/cool

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

如果我通过重新排序内容来更改" myfile",以便"脚本/erthing"首先出现,如下:

scripts/whatever
hot/warm
cold/cool

然后,当我运行脚本时的结果确实是。这是有问题的,因为我希望我的脚本检测到该正则模式是否发生在内容的任何行上,而不仅仅是第一个。

您的状况:

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

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

它不匹配每行启动。

为此,您可以将grep与您的git diff命令一起使用(请参见下面的注释):

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

如果要避免使用GREP,则可以使用以下内容。

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

我在您发布的文件的两个版本上运行了此功能,并获得以下输出(按照您发布的顺序相同):

YES
NO
NO

NO
YES
NO

唯一的一件事是,它将在文件中的每行打印一次,因此,如果您只想打印一次,您可能想在"是"条件下使用中断。

如果要测试该"脚本",出现在 string >或的开头。线,然后执行此操作:

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

笔记

  • 您不需要逃脱Bash Regex中的斜线
  • $(< file)是一种bash bash的内置方式 $(cat file)

在这种情况下,使用GREP作为Anubhava证明的速度可能更清晰,更快。

最新更新