sed似乎只有在插入换行符时才能正确匹配模式

sed似乎只有在插入换行符时才能正确匹配模式,sed,Sed,我当前正在运行以下sed命令: sed 's/P(\(.*\))\\mid(\(.*\))/\\condprob{\1}{\2}/g' myfile.tex 本质上,我继承了一个格式奇怪的tex文件,并希望替换如下所有内容: P(<foo>)\mid(<bar>) 我想将其更改为: \condprob{\vec{m}_i}{t,h,\alpha} = \prod_{u\in\mathcal{U}}\condprob{\vec{m}_{iu}}{t,h,\alpha}

我当前正在运行以下sed命令:

sed 's/P(\(.*\))\\mid(\(.*\))/\\condprob{\1}{\2}/g' myfile.tex
本质上,我继承了一个格式奇怪的tex文件,并希望替换如下所有内容:

P(<foo>)\mid(<bar>)
我想将其更改为:

\condprob{\vec{m}_i}{t,h,\alpha} = \prod_{u\in\mathcal{U}}\condprob{\vec{m}_{iu}}{t,h,\alpha}
但是,sed始终缺少第一个\mid,而是给了我以下信息:

\condprob{\vec{m}_i)\mid(t,h,\alpha) = \prod_{u\in\mathcal{U}} P(\vec{m}_{iu}}{t,h,\alpha}
如果我在=符号处添加一个换行符,它与所有内容都匹配

有人能帮我解决这个问题吗?或者告诉我为什么会这样

谢谢

编辑:谢谢choroba和Sloopjon,你们都回答了我的原因,Sloopjon的解决方案实际上正是我所需要的。choroba:我想我得再等一天才能学会perl

对于那些感兴趣的人来说,当Sloopjon的解决方案转化为我的问题时,看起来是这样的(匹配所有不是右括号的内容):

问题在于
*
量词的贪婪性。它尽可能多地匹配,即它不会在第一次时停止

您可以尝试Perl,它的特点是“非贪婪”(节俭、懒惰)
*?

perl -pe 's/P\((.*?)\)\\mid\((.*?)\)/\\condprob{$1}{$2}/g' 

看起来您希望
p(\(.*)
只匹配
p(\vec{m}u i)
,但是
*
量词是贪婪的,所以它实际上匹配
p(\vec{m}u i)\mid…p(\vec{m}{u})
。有两种常见的修复方法:如果您的工具支持非贪婪量词,则使用该量词;或者更改模式,使其仅与您期望的匹配。例如,如果您知道括号不会嵌套在此
P()
构造中,请将
*
更改为
[^]*

编辑:我还建议您在遇到这样的问题时寻找正则表达式可视化工具或调试器。例如,将示例粘贴到debuggex.com中可以清楚地了解发生了什么

\condprob{\vec{m}_i)\mid(t,h,\alpha) = \prod_{u\in\mathcal{U}} P(\vec{m}_{iu}}{t,h,\alpha}
sed 's/P(\([^)]*\))\\mid(\([^)]\))/\\condprob{\1}{\2}/g' myfile.tex
perl -pe 's/P\((.*?)\)\\mid\((.*?)\)/\\condprob{$1}{$2}/g'