正则表达式向前移除字符串的中间部分

时间:2016-02-19 11:00:41

标签: regex linux sed

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

我有('app','model.whatever.id')('app','model.whatever.whateveragain.status')('app','model.whatever.type').

等字符串

我需要将这些字符串的所有实例替换为:

('app','model.id')
('app','model.status')
('app','model.type')

一些笔记。我只需要匹配以model.whatevermodel.开头的字符串,中间可以有1个或多个块,我需要保留最后一条信息,即id,{{1}等等。

我目前的代码是:

status

这似乎适用于大多数示例,但在find /var/www/html/test2 -type f -print0 | xargs -0 sed -i '/.*model\..*\./{s//model./g}' 的情况下,括号外的最后一个完整停止会导致问题,因为括号被删除(我有一个实例,其中fullstop可以发生350个字符以后这么大的块这些线条正在被删除。

请原谅我,因为正则表达式不是我的强项,但我试图使用以下内容,但我没有得到理想的结果。这意味着匹配括号前最后一次出现的完全停止。

('app','model.whatever.type').

任何人都可以指出我正确的方向,因为我觉得我的调整远远超出我的需要。

1 个答案:

答案 0 :(得分:2)

我不知道任何支持环视断言的sed实现。

但似乎你并不需要它们。我用更简单的正则表达式来获得预期的输出:

sed -e 's/model\.[^'\'']*\./model./'

sed -e "s/model\.[^']*\./model./"
sed -E 's/(model\.)[^'\'']*\./\1/'
sed -E "s/(model\.)[^']*\./\1/"

棘手部分的解释:

  • [开始一个角色类。
  • ^否定了这门课程。
  • '结束单引号字符串。
  • \'字面引用。 shell将删除反斜杠。
  • '再次启动引用的字符串。
  • ]关闭课程。
  • *零次或多次。

所以,它只能解决shell引用问题。什么sed得到它与下面的双引号字符串相同。