尝试匹配任何看起来像{% extends "file.txt" %}
的字符串,使用以下代码:
local FILE_REG="(\.{0,2}\/)*([a-zA-Z0-9_]*|\/[a-zA-Z0-9_]*)*[a-zA-Z0-9_]*\.[a-zA-Z0-9_]*"
local EXTENDS_REG='{%\s*extends\s*".*"\s*%}'
local extends=0
local filename="$1"
echo $EXTENDS_REG;
while read -r line ; do
if [[ "$line" =~ "{%\s*extends\s*\".*\"\s*%}" ]] ; then
echo "true: $line";
else
echo "false: $line";
fi;
done < $filename
if语句无法在以下第一行返回true:
{% extends "base.tsh" %}
{% block my_block %}
echo "Hello World from inherit.tsh!"
{% endblock %}
我已经在regex101.com上验证了我的正则表达式,第2行上的模式与字符串完全匹配,而".*"
替换$FILE_REG
则匹配前一个字符串&#34; file.txt&# 34;被任何有效的/path/to/file_with_extension.txt
替换。
我在if语句中尝试了EXTENDS_REG的多种变体,包括:
if [[ "$line" =~ "$EXTENDS_REG" ]]
(变量)if [[ "$line" =~ $EXTENDS_REG ]]
(变量,无引号)if [[ "$line" =~ '{%\s*extends\s*".*"\s*%}' ]]
(正则表达式附近的单引号)if [[ "$line" =~ '{%\s*extends\s*"'$FILE_REG'"\s*%}' ]]
(复合+单引号)if [[ "$line" =~ {%\s*extends\s*\".*\"\s*%} ]]
(没有引号)但没有一个有效。我怀疑if正则表达式匹配是否太有限,无法在bash中正确读取正则表达式。
有人有任何解决方案吗?最理想的是我正在寻找一些有效的东西,除了grep,awk,sed和al之外,它不依赖于外部二进制文件。请不要python,ruby,perl等;)
感谢您的帮助!
答案 0 :(得分:3)
line='{% extends "file.txt" %}'
if [[ $line =~ \{%[[:space:]]*extends[[:space:]]*\".*\"[[:space:]]*%\} ]]
在bash中将\s
等字符类替换为[[:class:]]
形式的字符类。