我已经尝试了很多方法在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)
我想将某些__
值的文字替换为其他__
值,而不是任何与某些{{strong>匹配的文字1}}值_
所以,如果我要用第一行的其他取代某些,我会得到: -
__
显然,像(在perl中): -
for (vector<other__header>::const_iterator header = some__header_->begin(); header != some__header_->end(); ++header)
不起作用,因为它也会匹配 some__heade 我缺少什么是魔法正则表达式?
答案 0 :(得分: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
答案 1 :(得分:1)
也可以捕获尾随的非下划线:
sed 's/some\(__[a-zA-Z]*[^a-zA-Z_]\)/other\2/g'
关键是否定的字符类不能只是[^_]
,因为它允许名称的最后一个字母为非下划线。
还要注意轻微的重新安排以简化事情
答案 2 :(得分:0)
使用perl和alphas的占有量词:
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_