findstrコマンドの使い方

findstr コマンドに、

 /L 検索文字列をリテラルとして使用します。
 /R 検索文字列を正規表現として使用します。
 /C:文字列 指定された文字列をリテラル検索文字列として使用します。

というオプションがあるが、/L の「リテラル」と /C の「リテラル」の意味合いがよくわからなかったが、使い方がようやくわかった。

findstr "abc xyz" は、"abc xyz"というパターンを検索するのではなく、"abc" または "xyz" というパターンを検索する。unixgrep とは空白の意味が違う。
"abc xyz" というパターンを検索したい時は、findstr /C:"abc xyz" とする。
これはこれでいいのだが、空白を含む正規表現の時に困っていた。

findstr "^@echo off" だと、"行頭の@echo" または "off" にマッチしてしまう。かといって findstr /C:"^@echo off" だと正規表現で無くなり、"^@echo off" という山記号を含んだ文字列にしかマッチしない。findstr "^@echo off" や findstr "^@echo[ ]off" も駄目である。

もしかして、/L と /C の「リテラル」という言葉の意味が違うのではないかと思って、findstr /R /C:"^@echo off" とやってみたところ、うまく希望通りの動作をする。
/R(正規表現) と /L(単純文字列) の両オプションで、/R がデフォルトだが /C を指定すると /L がデフォルトに変わると言うことのようだ。/R を明示指定すればそちらが優先して正規表現となる。

まとめとしては、findstr を grep のように使うためには、/C: で文字列を指定して /R も指定するということだ。

12/26の記事で、行頭に空白以外の文字がある行の抽出が上手く行かなかったが、

findstr /r /c:"^[^ ]"

で行ける。