解决方案
%
只要您的输入字符串中没有任何字符,这就会起作用:
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'