Regex 查找并替换

Regex 查找并替换,regex,sed,Regex,Sed,我需要在几百份文件中修改以下文本 {% url project.app.views.chart %} 它是这样写的 {% url "project.app.views.chart" %} 你知道下一种方法吗?根据每次引号之间的文本不同,你知道下一种方法吗 谢谢,假设您想在url和%}之间包装字符串 类似的方法可能会奏效: sed -e 's/url /url "/' -e 's/ %}/" %}/' 假设您想在url和%}之间包装字符串 类似的方法可能会奏效: sed -e 's/url

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

{% url project.app.views.chart %}
它是这样写的

{% url "project.app.views.chart" %}
你知道下一种方法吗?根据每次引号之间的文本不同,你知道下一种方法吗


谢谢,

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

类似的方法可能会奏效:

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

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

类似的方法可能会奏效:

sed -e 's/url /url "/' -e 's/ %}/" %}/'
解决方案 只要您的输入字符串中没有任何
%
字符,此选项就可以工作:

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”%
So
url“test”%
重写它。 模式前后的部分没有修改,因此它将输出
{%url“test”%}

其他可能性 要避免在已有引号的情况下添加另一组引号,只需在
url
之后添加
url[^”]
,即:
url[^”]

以下是完整的命令:

sed -r 's/url ([^"][^%]+) %/url "\1" %/g'
解决方案 只要您的输入字符串中没有任何
%
字符,此选项就可以工作:

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”%
So
url“test”%
重写它。 模式前后的部分没有修改,因此它将输出
{%url“test”%}

其他可能性 要避免在已有引号的情况下添加另一组引号,只需在
url
之后添加
url[^”]
,即:
url[^”]

以下是完整的命令:

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

不同,如何?给定文件的替换从何而来?不同,如何?一个给定文件的替换从何而来?这很好,你能分析一下它是如何工作的吗?谢谢你的帮助,我刚刚发现了一个问题,如果已经有引号,那么它会添加另一对。@felix001然后只需在
url
之后添加
url[^]
,这样:
url[^]
它删除了第一个字符,即{%url“roject.app.views.chart”%}是的,只需移动括号也可以。这很好,你能分析一下它是如何工作的吗?谢谢你的帮助,我刚刚发现了一个问题,如果已经有引号,那么它会添加另一对。@felix001然后只需添加
[^]
url
之后,这样做:
url[^”]
它删除了第一个字符,即{%url“roject.app.views.chart”%}是的,只需移动括号也可以。