我需要修改几百个文档中的以下文本......
{% url project.app.views.chart %}
所以它是这样的
{% url "project.app.views.chart" %}
根据每次不同的引号之间的文本,您知道执行此操作的下一种方法吗?
谢谢
最佳答案
解决方案
只要输入字符串中没有任何 %
字符,此方法就会起作用:
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
选项位于此处,因为扩展正则表达式
是我更喜欢使用的选项。
现在,替换部分。
sed 's/pattern/replacement/g'
用于替换文本,将模式匹配为正则表达式
,并将其替换为替换。
g
是一个替换选项,这意味着您要替换文本中出现的模式多次。
所以这里的模式是url ([^%]+) %
。 url
和 %
部分非常符合逻辑且易于获取(如果没有,请告诉我)。 ([^%]+)
表示“捕获除 %
以外且至少由一个字符组成的所有内容”。括号允许保存这部分,以便在 \x
后重用它,其中 x 是括号组的编号(此处为 \1
)。
因此,当它收到 {% url test %}
时,该模式会匹配 url test %
,其中 test
保存在 \1
,并用 url "\1"%
重写它,所以 url "test"%
。
模式前后的部分没有修改,所以会输出 {% url "test"%}
其他可能性
为了避免添加另一组引号(如果已经存在),只需在 url
之后添加 [^"]
即可:url [^"]
.
这是完整的命令:
sed -r 's/url ([^"][^%]+) %/url "\1" %/g'
关于regex - sed 查找和替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17364049/