findstr:如何转义点?

findstr:如何转义点?

我不明白为什么findstr不按我想要的方式工作。

我的测试目录中有以下文件:

aaa.jpg
bbb.png
ccc.svg

aaa_s.jpg
bbb_s.png
ccc_s.svg

aaa_small.jpg
bbb_small.png
ccc_small.svg

我将以下行直接传递给 cmd.exe:

for /f "delims=" %f in ('dir /b /a:-d ^| findstr /ile "gif jpg png svg" ^| findstr /ie "_s.*"') do echo "%f"

我认为它应该与以下文件匹配:

aaa_s.jpg
bbb_s.png
ccc_s.svg

但实际上这是火柴

aaa_s.jpg
bbb_s.png
ccc_s.svg

aaa_small.jpg
bbb_small.png
ccc_small.svg

是的,我明白问题在于点作为“任何字符”起作用,而不是按字面意思处理。

findstr /ie "_s.*"

Bot 我该如何逃脱呢?使用反斜杠,即将其更改为

findstr /ie "_s\.*"

不起作用。

答案1

我怎样才能转义通配符.以匹配文字.字符?

使用 是正确的\,但您需要一个附加字符.来找到剩余的字符。

findstr /ie "_s\..*"

示例(类型和cmd外壳):

F:\test>dir /b /a:-d | findstr /ile "gif jpg png svg" | findstr /ie "_s.*"
aaa_s.jpg
bbb_s.jpg
ccc_s.jpg
aaa_small.jpg
bbb_small.jpg
ccc_small.jpg

F:\test>dir /b /a:-d | findstr /ile "gif jpg png svg" | findstr /ie "_s\..*"
aaa_s.jpg
bbb_s.jpg
ccc_s.jpg

因此您的批处理文件应该包含:

for /f "delims=" %f in ('dir /b /a:-d ^| findstr /ile "gif jpg png svg" ^| findstr /ie "_s\..*"') do echo "%f"

答案2

对于这个特定的任务,你也可以逃避"."在里面findstr如果您替换,则不要使用它:

dir /b /a:-dwhere .:*_s.*

findstr /ie "_s\.*"findstr /ei "gif jpg png svg"

where .:*_s.*|findstr /ei  "gif  jpg  png  svg"

for /f delims^= %f in ('where .:*_s.*^|findstr /ei  "gif  jpg  png  svg"')do echo "%~nxf"

相关内容