2

I need to amended the following text in a few hundred documents ...

{% url project.app.views.chart %}

so it reads

{% url "project.app.views.chart" %}

Do you know the next way to do this based on the text between the quotes being different each time ?

Thanks,

4

2 回答 2

4

解决方案

%只要您的输入字符串中没有任何字符,这就会起作用:

sed -r 's/url ([^%]+) %/url "\1" %/g'

测试

$ echo '{% url test %}{% url test 2 %}' | sed -r 's/url ([^%]+) %/url "\1" %/g'
{% url "test" %}{% url "test 2" %}

解释

让我们解释一下这个答案。该-r选项在这里,因为extended regexes是我更喜欢使用的选项。

现在,替换部分。

sed 's/pattern/replacement/g'

用于替换文本,将模式匹配为 aregular expression并将其替换为replacement

g是一个替换选项,这意味着您要替换文本中出现的模式多次。

所以这里的模式url ([^%]+) %url%部分非常合乎逻辑且易于获得(如果没有,请告诉我)。([^%]+)意思是“捕获所有不是 a%并且至少由一个字符组成的东西” 。括号允许保存这部分,\x在 x 是括号组的编号后重用它(这里是\1)。

所以当它接收到时{% url test %},模式匹配url test %wheretest保存在下,并用so\1重写它。模式前后的部分没有被修改,所以会输出url "\1" %url "test" %{% url "test" %}

其他可能性

为避免添加另一组引号(如果已经存在),只需在此[^"]之后添加url: url [^"]

这是完整的命令:

sed -r 's/url ([^"][^%]+) %/url "\1" %/g'
于 2013-06-28T11:59:36.807 回答
0

假设您想在url和之间包装字符串%}

像这样的东西可能会起作用:

sed -e 's/url /url "/' -e 's/ %}/" %}/'
于 2013-06-28T11:53:02.940 回答