如何grep给定标记之外的标记

时间:2013-11-08 15:26:21

标签: regex grep

我尝试使用grep检查文件是否包含指定区块的<script>标记 {% block js %} ... {% endblock %}

如果文件不包含{% block page_content %}元素,则应忽略该元素(并非所有模板实际上都包含js块)。

到目前为止我的表达是:

grep -lrPz '(?s){% block (?!js).*? %}(?=.*?<script).*?{% endblock %}' src/

任何想法我做错了什么?

这是一个应该检测到的文件:

{% block page_content %}
  {{ parent() }}
  <script> console.log("Hello world"); </script>
{% endblock %}

以下是不应检测到的文件:

{% block who_knows %}
  {{ parent() }}
  <script> console.log("Hello world"); </script>
{% endblock %}

{% block page_content %}
  {{ parent() }}
{% endblock %}
{% block js %}
  <script> console.log("Hello world"); </script>
{% endblock %}

{% block js %}
  <script> console.log("Hello world"); </script>
{% endblock %}
{% block page_content %}
  {{ parent() }}
{% endblock %}

1 个答案:

答案 0 :(得分:1)

无法指出您的解决方案出了什么问题,但另一个选项是将中的记录分隔符设置为开始和结束js标记并对其执行检查每个“记录”的内容

awk -v RS='\\{% block js %\\}|\\{% endblock %\\}' '/<script>[^<]*<\/script>/ &&
        (RT != "{% endblock %}" || prevRT != "{% block js %}"){bad++};
        /\{% block page_content %\}/{content++};
          {prevRT=RT};
          END{if(bad && content)print FILENAME":bad file"}' file.txt