2

我已经尝试了很多方法来在 perl/sed 中解决这个问题,并阅读了很多关于负前瞻等的信息,但匹配仍然不起作用。
我有诸如:-

for (vector<some__header>::const_iterator header = some__header_->begin(); header != some__header_->end(); ++header)  

for (vector<some__trailer>::const_iterator header = some__trailer_->begin(); header != some__trailer_->end(); ++header)  

我想用其他值替换匹配某个__的文本,但不是任何匹配某个值的文本_____

所以,如果我要在第一行用其他替换一些,我会得到:-

for (vector<other__header>::const_iterator header = some__header_->begin(); header != some__header_->end(); ++header)  

显然,类似(在 perl 中):-

(some)__([a-zA-Z]*)(?!_)

不起作用,因为它也会匹配some__heade
我缺少什么神奇的正则表达式部分?

4

3 回答 3

1

你可以说:

sed 's/some__header[^_]/other__value/g' filename

还,

sed 's/some__[^_]*[^_]/other__value/g' filename

如果只是some要替换为other,请说:

sed 's/some__\([^_]*\)[^_]/other__\1/g' filename
于 2013-11-07T14:13:56.120 回答
1

只需捕获尾随的非下划线:

sed 's/some\(__[a-zA-Z]*[^a-zA-Z_]\)/other\2/g'

关键是否定字符类不能仅仅[^_]因为它允许名称的最后一个字母是非下划线。

还要注意轻微的重新排列以简化事情

于 2013-11-07T14:15:30.423 回答
0

对 alpha使用和占有量词:

perl -pe 's/some(__(?>[[:alpha:]]*))(?!_)/other$1/g' infile

使用示例行:

for (vector<some__header>::const_iterator header = some__header_->begin(); header != some__header->end(); ++header)  some__header_

它产生:

for (vector<other__header>::const_iterator header = some__header_->begin(); header != other__header->end(); ++header)  some__header_
于 2013-11-07T14:19:16.550 回答