web-dev-qa-db-ja.com

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.*"

ボットはどうすればそれをエスケープできますか?バックスラッシュを使用する、つまり次のように変更する

findstr /ie "_s\.*"

動作しません。

4
john c. j.

ワイルドカード.をエスケープして、リテラル.文字に一致させるにはどうすればよいですか?

\を使用して正しい方向に進んでいますが、残りの文字を見つけるには、追加の.が必要です。

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"
5
DavidPostill

この特定のタスクでは、"."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"
3
It Wasn't Me