尝试使用以下代码匹配任何看起来像 {% 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
替换 ".*"
与前一个字符串匹配,"file.txt"被任何有效的 /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等请;)
谢谢你的帮助!
1 回答
在bash中,将
\s
等字符类替换为[[:class:]]
形式的字符类 .这是definitive list .