尝试匹配任何类似于 {% 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 等;)
感谢您的帮助!
最佳答案
line='{% extends "file.txt" %}'
if [[ $line =~ \{%[[:space:]]*extends[[:space:]]*\".*\"[[:space:]]*%\} ]]
在 bash 中,将 \s
等字符类替换为 [[:class:]]
形式的字符类。
这是一个definitive list .
关于regex - bash 扩展正则表达式 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32020976/