Sed找到并替换

时间:2013-06-28 11:50:05

标签: regex sed

我需要在几百份文件中修改以下文字......

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

所以它读取

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

根据引号之间的文字每次都不同,你知道下一个方法吗?

谢谢,

2 个答案:

答案 0 :(得分:4)

解决方案

这可以作为soons,因为您的输入字符串中没有任何%个字符:

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'

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

g是一个替换选项,表示您希望将文本替换为文本中存在的次数。

所以这里的模式url ([^%]+) %url%部分非常符合逻辑且易于获取(如果没有,请告诉我)。 ([^%]+)表示“捕获不是%的所有内容,并且至少由一个字符”组成。括号允许保存此部分,以便在\x之后重复使用,其中x是括号组的编号(此处它将是\1)。

因此,当它收到{% url test %}时,模式与url test %匹配,test保存在\1下,并用url "\1" %重写{{1} }}。 模式之前和之后的部分不会被修改,因此它将输出url "test" %

其他可能性

要避免添加另一组引号(如果已经存在),只需在{% url "test" %}之后添加[^"]url

这是完整的命令:

url [^"]

答案 1 :(得分:0)

假设您要在url%}之间换行。

这样的事情可能有用:

sed -e 's/url /url "/' -e 's/ %}/" %}/'