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

时间:2015-08-15 02:41:28

标签: regex bash if-statement

尝试匹配任何看起来像{% 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等;)

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

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

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

这是definitive list