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”%
Sourl“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”%
Sourl“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”%}是的,只需移动括号也可以。