如果我有以下代码:
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证明的速度可能更清晰,更快。