regex - sed 查找和替换

标签 regex sed

我需要修改几百个文档中的以下文本......

{% 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/

相关文章:

linux - 我们如何从 DeNormalized 文本文件 one 构建 Normalized 表?

macos - sed 正则表达式错误\1 未在 RE 中定义

linux - Shell - 如何在第 n 次出现管道后删除特定字符串

javascript - 正则表达式检测前导零并检查 0 到 12 位数字的长度

java - 在Java中解析管道分隔的字符串(管道可以转义)

正则表达式匹配两个具有相同长度的不同组

python正则表达式,从列表输出中提取字节

linux - 关于递归文件运行和替换输入文件的主要内容

php - 在 PHP 中使用正则表达式解析 token

file - 合并/追加文件并重新编号 unix 中的第一列