使用Bash动态匹配和替换

时间:2017-07-07 13:01:16

标签: regex sed

我正在使用bash动态查找并用另一个字符串替换字符串,例如

href="/controller/action"

href="<?php echo $this->url("controller", action-> "action") ?>"

我正在使用这个sed命令来查找和更改它工作正常......

sed -i 's%href=\"/controller/action%href=\"<?php echo $this->url(\"controller\", action-> \"action\") ?>%g' changes.txt

我想要的是旧字符串使用通配符查找模式后面的任何类型。我看到这是一个选项,但不起作用。

sed -i 's%href=\"/(.*)/(.*)%href=\"<?php echo $this->url(\"/1\", action-> \"/2\") ?>%g' changes.txt

我如何能够运行此命令,以便控制器和操作可以是任何内容并从旧字符串中动态获取并输入到新字符串中?

1 个答案:

答案 0 :(得分:2)

你正在使用一个贪婪的点匹配模式,几乎不是你需要的,因为一个点匹配任何符号,而*量词可以抓住尽可能多的字符。你需要的是一个否定的括号表达式[^/]*,它匹配除/以外的零个或多个字符。

此外,由于您使用的是BRE POSIX正则表达式,因此您必须转义捕获模式的一部分的括号,否则它们表示文字()符号。

使用

sed -i 's%href="/\([^/]*\)/\([^/]*\)%href="<?php echo $this->url("\1", action-> "\2") ?>%g' changes.txt