这个vim正则表达式有什么问题?

时间:2015-01-28 04:58:35

标签: vim

我有一个扩展名为.elf的文件列表,如此

file1.elf file2.elf file3.elf

我正在尝试使用run file1.elf >file1.log之类的运行命令在shell中运行它们,并将结果输入到文件名为.log的日志文件中。 我的文件列表非常大。我正在尝试一个vim正则表达式,因此它将匹配文件名,例如file1中的file1.elf,并使用它来创建日志文件的名称。我正在尝试这样的

s/\(\(\<\w\+\)\@<=\.elf\)/\1 >\2\.log/

在这里,我尝试匹配由.elf继续的文本,并将其保存在\1中,我希望将文件名称放在其中\2我希望只是包含文件名减去扩展名。但这给了我 run file1 >file1.run\1不接受完整的文件名,它有一些错过.elf扩展名。我可以\1\.elf来获得正确的结果,但我想知道为什么表达式不像我预期的那样工作?

2 个答案:

答案 0 :(得分:2)

您在匹配模式中使用\@<=。这是 positiv lookahead 断言。根据文档(:help /\@<=1),

  

如果前面的原子匹配在

之后,则零宽度匹配

重要的一点是匹配零宽度,这就是你正在进行的尝试,.elf(后面跟着)匹配但是没有widht,所以{{1 }}不包含后缀\1

相反,使用

会更容易
.elf

在这里,我使用%s/\v(.*)\.elf$/run \1.elf > \1.log/ 打开非常神奇的\v)。启用此功能后,在使用分组parantheses时,不需要那些反斜杠。

然后有:help magic匹配并存储文件名,直到

(.*)似乎是每个文件后缀。

在替换部分中,\.elf$之后我添加了文字/,后跟run\1将替换为存储的文件名(不带\1后缀)。

答案 1 :(得分:1)

\@<=似乎毫无意义且不必要。删除它可以获得所需的行为。