2017-09-06 106 views
3

如果我有以下代码:如何在输出与正则表达式比较时保留bash中的换行符?

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

和“MYFILE”包含以下内容:

hot/warm 
scripts/whatever 
cold/cool 

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

如果我改变“MYFILE”通过重新排序的内容,使“脚本/不管”是第一位的,象下面这样:

scripts/whatever 
hot/warm 
cold/cool 

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

+0

为什么不使用'grep -q'^ scripts /.*$'myfile'? – chepner

回答

3

您的条件:

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

是对完整的文件数据的正则表达式检查(即您使用提取命令cat myfile),因此它只会在文件内容与scripts/开始匹配。

它不匹配每一行的开始。

对于您可以只使用grepgit diff命令(参见下面的注释):

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

我用'cat myfile'作为例子,但实际上我打算执行一个'git diff'命令而不是有一个真正的文件来grep通过。 – onlywei

+0

如果您使用'git diff',则使用'git diff | grep -q'scripts /' – anubhava

+1

谢谢,尽管如此,我认为你仍然留在“myfile”中的错误的git diff代码块的答案。 – onlywei

2

如果你想避免用grep您可以使用,而读-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

1

如果你想测试出现在串在开始的开端“脚本”,然后做到这一点:

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

  • 你不需要在bash正则表达式中跳过斜线
  • $(< file)是bash内建的方式要做$(cat file)

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