我有一个扩展名为.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
来获得正确的结果,但我想知道为什么表达式不像我预期的那样工作?
答案 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)
\@<=
似乎毫无意义且不必要。删除它可以获得所需的行为。