regex - bash 扩展正则表达式 if 语句

标签 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与前一个字符串匹配,并将“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/

相关文章:

C# 用正则表达式拆分 string.format 字符串

linux - 在文件名中调用时 Shell 变量为空,但在回显或在其他地方调用时则不是

linux - Bash 替换字符串我不希望它这样做

linux - 如何使用 bash 监视目录中新创建的文件?

linux - Bash 脚本如果没有像我预期的那样处理

java - 如何判断数组下标是否为偶数?

python-3.x - 删除方括号和大括号中不必要的空格

regex - 'lazy' 和 'greedy' 在正则表达式中意味着什么?

javascript - 当两个函数具有某些相似性时进行重构

regex - 使用 sed 替换未转义的双引号