如何在输出与正则表达式比较时保留bash中的换行符?
问题描述:
如果我有以下代码:如何在输出与正则表达式比较时保留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的结果。这是有问题的,因为我希望我的脚本能够检测这个正则表达式模式是否出现在内容的任何一行上,而不仅仅是第一个。
答
您的条件:
[[ "$(cat myfile)" =~ ^scripts\/.* ]];
是对完整的文件数据的正则表达式检查(即您使用提取命令cat myfile
),因此它只会在文件内容与scripts/
开始匹配。
它不匹配每一行的开始。
对于您可以只使用grep
与git diff
命令(参见下面的注释):
if git diff | grep -q '^scripts/'; then
echo 'YES'
else
echo 'NO'
fi
答
如果你想避免用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。
答
如果你想测试出现在串在行开始或的开端“脚本”,然后做到这一点:
[[ "$(< myfile)" =~ (^|$'\n')scripts/.* ]]
注
- 你不需要在bash正则表达式中跳过斜线
-
$(< file)
是bash内建的方式要做$(cat file)
在这种情况下使用grep作为anubhava演示可能更清晰和更快。
为什么不使用'grep -q'^ scripts /.*$'myfile'? – chepner