首页 文章

bash扩展了正则表达式if语句

提问于
浏览
2

尝试使用以下代码匹配任何看起来像 {% 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 回答

  • 3
    line='{% extends "file.txt" %}'
    if [[ $line =~ \{%[[:space:]]*extends[[:space:]]*\".*\"[[:space:]]*%\} ]]
    

    在bash中,将 \s 等字符类替换为 [[:class:]] 形式的字符类 .

    这是definitive list .

相关问题