我尝试使用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 %}
答案 0 :(得分:1)
无法指出您的grep解决方案出了什么问题,但另一个选项是将gawk中的记录分隔符设置为开始和结束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