找到一个模式并用引号括起来

时间:2015-06-25 10:10:28

标签: regex django sed grep pattern-matching

所以我从Django 1.3升级> 1.4并且要求{% url app:X:Y %}的模式为{% url "app:X:Y" %}。项目中有493个这种模式的实例,因此我试图找到如何自动化它。

要清楚的是,括号内可能还有其他单词,但它始终是"{% url "之后的单词,直到我必须包装的下一个空格。

我查看了sed,但我不确定如何使用grep正常工作。有没有人有一个可以在这里工作的例子?

使用示例文件查看:

此文件有2个网址,但它应该只捕获第二个网址(grep isn确实是问题,它是替换。)此文件应完全相同,但{% url admin:index %}除外应为{% url "admin:index" %}

{% extends "admin/index.html" %}
   {% load i18n %}
   {% load url from future %}

  {% if not is_popup %}
  {% block breadcrumbs %}
  <div class="breadcrumbs">
  <a href="{% url admin:index %}">{% trans 'Home' %}</a>
  &rsaquo;
  {% for app in app_list %}

这是一个查找所有案例的grep,但是对于那些已经有引号的人来说它失败了,当然它实际上并没有编辑它们grep -r "{% url .* " .

1 个答案:

答案 0 :(得分:2)

您只需将正则表达式设置为此表单:{% url <things> %}。通过将组括在括号中,我们可以将它们打印出来。注意<things>是一组A:B:C:...:Z,也就是我们定义为&#34;任何符合空格的内容&#34}。

所有在一起:

sed 's/\({% url \)\([^ ]*\)\( %}\)/\1"\2"\3/' file

您可以通过以下方式对给定文件夹中的所有文件执行此操作:

for file in *
do
    sed '...' "$file"
done

如果您说sed -i.bak '...' file,您将获得就地编辑的文件,并创建备份file.bak(这样做总是好的,以防万一!)。

测试

将您的给定文件存储在a中,它会返回...

$ sed 's/\({% url \)\([^ ]*\)\( %}\)/\1"\2"\3/' a
{% extends "admin/index.html" %}
{% load i18n %}
{% load url from future %}

{% if not is_popup %}
{% block breadcrumbs %}
<div class="breadcrumbs">
<a href="{% url "admin:index" %}">{% trans 'Home' %}</a>
&rsaquo;
{% for app in app_list %}