Regex 正则表达式使用look-ahead删除字符串的中间部分
我正在尝试使用sed替换我拥有的几千个字符串 我有像Regex 正则表达式使用look-ahead删除字符串的中间部分,regex,linux,sed,Regex,Linux,Sed,我正在尝试使用sed替换我拥有的几千个字符串 我有像('app','model.whatever.id')或('app','model.whateveragain.status')或('app','model.whatever.type')。 我需要替换这些字符串的所有实例,如下所示: ('app','model.id') ('app','model.status') ('app','model.type') 一些注释。我只需要匹配以model.或whatevermodel.开头的字符串,中间
('app','model.whatever.id')
或('app','model.whateveragain.status')
或('app','model.whatever.type')。
我需要替换这些字符串的所有实例,如下所示:
('app','model.id')
('app','model.status')
('app','model.type')
一些注释。我只需要匹配以model.
或whatevermodel.
开头的字符串,中间可以有一个或多个块,我需要保留最后一条信息,即id
,状态
等
我目前拥有的代码是:
find /var/www/html/test2 -type f -print0 | xargs -0 sed -i '/.*model\..*\./{s//model./g}'
这似乎适用于大多数示例,但在('app','model.whatever.type')的情况下。
括号外的最后一个句号会导致一个问题,因为括号被删除了(我举过一个例子,句号可能出现在350个字符之后,因此会删除大量的行
请原谅,正则表达式不是我的强项,但我尝试使用以下内容,但没有得到预期的结果。这是为了匹配括号前最后一次出现的句号
find /var/www/html/test2 -type f -print0 | xargs -0 sed -i '/model\..*(?:(?!^.:[ ])[\s\S])*\\)/{s//model./g}'
有人能给我指出正确的方向吗,因为我觉得我离我需要的东西还有一些距离。我不知道有任何支持环视断言的sed实现 但是你似乎不需要它们。我用更简单的正则表达式得到了预期的输出:
sed -e 's/model\.[^'\'']*\./model./'
或
对棘手部分的解释:
启动字符类[
否定该类^
结束单引号字符串”
文本引号。shell将删除反斜杠\'
再次启动带引号的字符串”
关闭该类]
零次或多次*
因此,它只是用来解决shell引用问题。什么sed得到的结果与下面的双引号字符串相同。我不知道有哪个sed实现支持环顾断言 但是你似乎不需要它们。我用更简单的正则表达式得到了预期的输出:
sed -e 's/model\.[^'\'']*\./model./'
或
对棘手部分的解释:
启动字符类[
否定该类^
结束单引号字符串”
文本引号。shell将删除反斜杠\'
再次启动带引号的字符串”
关闭该类]
零次或多次*
因此,它只是用来解决shell引用。什么sed得到的结果与下面的双引号字符串相同。你确定你的sed实现支持环顾断言吗?@choroba这是一个很好的观点。我从来没有想到过这个想法。看这里,似乎你是正确的,sed实际上没有这个功能。请随意将此作为一个答案,因为我似乎需要使用perl。你确定你的sed实现支持环顾断言吗?@choroba,这是一个很好的观点。我甚至从未想到过这个想法。看这里,似乎你是正确的,sed实际上没有此功能。请随意将此作为一个答案,因为我似乎不需要o使用perl。甚至更好。非常感谢,我刚刚进行了测试,效果非常好。我基本上理解这里发生的事情,但我不是100%了解这一部分
[^'\'']* < /代码>,如果您有第二个解释,那将是很好的。再次感谢您的快速响应。它非常感谢。我只是指出,如果有人卡在最后两个上,则<代码> -e代码>是使用扩展的RE的BSD SED选项,相当于GNU SED的“代码> -r>代码>选项。最近FreeBSD版本考虑了这些OPTI。ons是同义词,但您可能会在OSX中使用-E
。哦,@TheHumbleRat将帮助解释引号。:@TheHumbleRat:explained.@choroba再次感谢您的帮助和详细信息。当然是教人钓鱼,甚至更好。非常感谢,我刚刚测试过,效果非常好。我基本上理解这里发生的事情,但我不是100%理解这一部分,[^'\'']*
,如果你有时间解释的话,那就太好了。再次感谢您的快速回复。非常感谢。我只想指出,如果有人在最后两个问题上遇到困难,-E
是使用扩展RE的BSD sed选项,相当于GNU sed的-r
选项。最近FreeBSD版本认为这些选项同义,但在OSX中可能使用<代码> -E <代码>。哦,还有@TheHumbleRat,将帮助解释这些引语@亨伯拉特:解释。@choroba再次感谢您的帮助和详细信息。当然是教人钓鱼。