我正在尝试使用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').
任何人都可以指出我正确的方向,因为我觉得我的调整远远超出我的需要。
答案 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得到它与下面的双引号字符串相同。