我们有一个 Markdown 验证器,作者用它来验证他们的 md 文件,其中一项检查是 Liquid 标签验证,我们在其中检查 md 文件中的无效 Liquid 标签。我的要求是添加一个验证来检查花括号是否正确使用并正确终止。例如,如果作者打开 5 个 { ,则同样应该有 5 个结束 } 。但我们还必须从该验证中排除代码块。代码块内的任何括号都不应该被验证。代码块可以是 4 个空格缩进、3 个反引号或单个反引号。
bracecountopen=$(grep -o -i '{' $file | wc -l);
bracecountclose=$(grep -o -i '}' $file | wc -l);
if [ "$bracecountopen" != "$bracecountclose" ]; then
throw error
fi
用于排除代码块
var+=$(grep '^\ \ \ \ [^>]' $file);
while IFS= read -n1 char; do
if [[ "$char" == "\`" ]]; then
if [ $flag = 1 ]; then
flag=0;
continue
fi
flag=1;
fi
if [ $flag = 1 ]; then
# var+=$char;
echo ""
fi
done <$file
codebraceopen=$(echo "$var" | grep -o -i '{' | wc -l)
codebraceclose=$(echo "$var" | grep -o -i '}' | wc -l)
let "bracecountopen=bracecountopen - codebraceopen"
let "bracecountclose=bracecountclose - codebraceclose"
这种做法正确吗?有没有更好的逻辑来实现这一目标?这里的问题是一些作者在用反引号开始代码块之前添加了一个制表符或 4 个空格,这使得内容在 'var' 中出现两次,它被计入 4 个空格以及反引号检查中。如何解决这个问题?
答案1
这不是完整的答案,但这里有一个代码,awk
您可以使用它来计算打开和关闭大括号 ( {}
) 的数量:
codebraceopen=$(echo "$var" | awk '{n+=gsub("\{","",$0)} END {print n}' )
codebraceclose=$(echo "$var" | awk '{n+=gsub("\}","",$0)} END {print n}')
这将帮助您正确处理类似的构造}}} {{{
(如评论中所述)。
相同的技术可用于计算反引号、反斜杠等。