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