Regex 正则表达式使用look-ahead删除字符串的中间部分

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.开头的字符串,中间

我正在尝试使用sed替换我拥有的几千个字符串

我有像
('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再次感谢您的帮助和详细信息。当然是教人钓鱼。