Regex 使用Bash动态匹配和替换

Regex 使用Bash动态匹配和替换,regex,sed,Regex,Sed,我正在使用bash动态地查找一个字符串,并用另一个字符串替换它 href="/controller/action" href="<?php echo $this->url("controller", action-> "action") ?>" href=“/controller/action” href=“” 我正在使用这个sed命令查找并更改它,它运行良好 sed -i 's%href=\"/controller/action%href=\"<?php e

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

href="/controller/action"

href="<?php echo $this->url("controller", action-> "action") ?>"
href=“/controller/action”
href=“”
我正在使用这个sed命令查找并更改它,它运行良好

sed -i 's%href=\"/controller/action%href=\"<?php echo $this->url(\"controller\", action-> \"action\") ?>%g' changes.txt
sed-i的%href=\”/controller/action%href=\%g'changes.txt
我想要的是旧字符串使用通配符查找模式后面的任何类型。我看到这是一个选项,但不起作用

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

我怎样才能运行这个命令,使控制器和动作可以是任何东西,并且可以从旧字符串中动态获取并输入到新字符串中?

您使用的是贪婪的点匹配模式,这几乎从来都不是您需要的,因为点匹配任何符号,
*
量词可以获取尽可能多的字符。您需要的是一个反括号表达式
[^/]*
匹配零个或多个字符,而不是
/

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

使用

sed-i的%href=“/\([^/]*\)/\([^/]*\)%href=“%g”changes.txt

它以什么方式不起作用?错误输出、无输出、错误消息、内核转储或其他内容?想象一下,把你的车带到修理工那里,你给他们的唯一线索就是你想解决的问题是“这辆车坏了”。试一试:sed-i的%href=\”/([^)]+)/([^)]+)%href=\%g'changes.txt我猜。*搞乱了。你可以把它们改成。*?如果你想偷懒或者我有什么。如果成功的话,让我知道,我会写一个更好的答案。谢谢狙击手,我会试一试的!那里有一些正则表达式。我想尝试一下非懒惰版本:P.Ed,无错误,无更改,无核心转储和无损坏的汽车:)跳出捕获括号,使用
[^/]*
而不是
*
啊,我想用([^/]+)替换(.*)吧?我只是在你发送此邮件后设法得到了它。在新字符串中没有(..)和我的值有/1和/2,这应该是\1和\2。我知道这在技术上是一个不同的问题,但我希望你能给我一些启示或资源来审视我自己。上述方法非常有效。但是会有像/foo/bar这样的链接?type=R&year=&batchNumber=“>会把它搞得有点乱。这些链接怎么会被跳过?@SmiffyKmc该字符串匹配吗?@SmiffyKmc如果不匹配,请尝试
href=“/\([^/]\+\)/\([^/?]\+\)\b\([^?]\\$\)
并在替换字符串的末尾添加
\3
。很抱歉延迟!我还没来得及试一下,但现在就开始了。我确实尝试在结尾添加\3,看看它是否有任何作用,但结果并不理想。去试试你的魔术吧!
sed -i 's%href="/\([^/]*\)/\([^/]*\)%href="<?php echo $this->url("\1", action-> "\2") ?>%g' changes.txt