web-dev-qa-db-ja.com

findstrにスペースを含めるために検索パターンを書く方法は?

次のようなステートメントの出現について特定のディレクトリ内のすべてのファイルを検索したい

  Load frmXYZ

私はfindstrコマンドを使用してWindows 7にいます。私は試した:

  findstr /n Load.*frm *.*

しかし、これにより次のような望ましくない結果が得られます。

 If ABCFormLoaded Then Unload frmPQR

そこで、Loadfrmの間に空白スペースを入れて、次のようなコマンドを指定しようとしました。

 findstr /n Load frm *.*

しかし、これは、Word loadのすべての出現またはWord frmのすべての出現を検索しました。この問題を回避するにはどうすればよいですか?

30
CodeBlue

スペースを使用する場合、/C:オプションを使用して、リテラル文字列を正規表現/Rオプションに渡す必要があります。
正規表現に到達すると、正規表現として扱われます。

とはいえ、これは典型的なMSのゴミです。

2つの正規表現検索文字列を使用する

一番下の行は、2つの文字列を使用して次の場合を処理する必要があるということです。
Load frmは次のように先頭にあります。

  • Load frm apples bananas carrots

または途中で:

  • some other text Load frm and more

文字クラスのないバージョン

以下はXP sp3を使用しています。windows7は異なる場合があり、両方ともゴミです!

findstr /N /R /C:" *Load *frm" /C:"^Load *frm" test.txt

7:Load frm is ok    
8:    Load     frm is ok  

コロンマインド

注:/C:のコロンは、これが機能するために必須です。

コロンを省略した場合、findstrのエラー処理は、/Cを無効なオプションとして処理するだけで、その無効なオプションを無視して、先に進みます。予期しない望ましくない出力につながる。

文字クラスを使用した同等のバージョン

findstr /N /R /C:"[ ][ ]*Load[ ][ ]*frm" /C:"^Load[ ][ ]*frm" test.txt

文字クラスの内訳

// The first regex search string breaks down like this:
[ ]   // require 1 space
[ ]*  // optional many spaces
Load  // literal 'Load'
[ ]   // require 1 space
[ ]*  // optional many spaces
frm   // literal 'frm'

// The second regex search string breaks down like this:
^     // beginning of line
Load  // literal 'Load'
[ ]   // require 1 space
[ ]*  // optional many spaces
frm   // literal 'frm'

実際の正規表現は\bLoad\s+frmです

28
sln

使用 /cオプション:

findstr /n /c:"Load frm" *.*

ヘルプから(findstr /?):

/C:string  Uses specified string as a literal search string.
23
Joey

Word区切り文字の正規表現を使用する

特別な\<「Wordの始まり」正規表現記号を使用しました。

FindstrのWin10バージョンでこれを試しました。しかし、Microsoftによれば、この特別な \<シンボルは、WinXP以来findstr.exeにありました です。

以下で機能しない多くのオプションの完全な(そして苦痛な)内訳。

一番下:実際に機能したもの。

サンプルファイル自体

C:\>type lines.txt
Load frmXYZ                         // This line should match.
If ABCFormLoaded Then Unload frmPQR // This line should NOT match.
pears Load frm grapes pineapples    // This line should match.
                                    // This blank line should NOT match.
LOAD FRMXYZ                         // This line should match.
IF ABCFORMLOADED THEN UNLOAD FRMPQR // This line should NOT match.
PEARS LOAD FRM GRAPES PINEAPPLES    // This line should match.
                                    // This blank line should NOT match.
load frmxyz                         // This line should match.
if abcformloaded then unload frmpqr // This line should NOT match.
pears load frm grapes pineapples    // This line should match.

違う。通常の実行スペースでは、区切り文字として扱われます。

C:\>type lines.txt | findstr /N "Load frm"
1:Load frmXYZ                         // This line should match.
2:If ABCFormLoaded Then Unload frmPQR // This line should NOT match.
3:pears Load frm grapes pineapples    // This line should match.
9:load frmxyz                         // This line should match.
10:if abcformloaded then unload frmpqr // This line should NOT match.
11:pears load frm grapes pineapples    // This line should match.

間違った例:Regexオプションを使用すると、スペースはまだ区切り文字として扱われます。

C:\>type lines.txt | findstr /N /R "Load frm"
1:Load frmXYZ                         // This line should match.
2:If ABCFormLoaded Then Unload frmPQR // This line should NOT match.
3:pears Load frm grapes pineapples    // This line should match.
9:load frmxyz                         // This line should match.
10:if abcformloaded then unload frmpqr // This line should NOT match.
11:pears load frm grapes pineapples    // This line should match.    

もっと正しいが、まだ間違っている。/Cオプションを使用すると、スペースが保持されますが、他の文字ケースは見つかりません。

C:\>type lines.txt | findstr /N /R /C:"Load frm"
1:Load frmXYZ                         // This line should match.
3:pears Load frm grapes pineapples    // This line should match.

違う。 「Ignore Case」の/ Iは役に立ちません。望まない単語の中から一致を取得します。

C:\>type lines.txt | findstr /N /R /I /C:"Load frm"
1:Load frmXYZ                         // This line should match.
2:If ABCFormLoaded Then Unload frmPQR // This line should NOT match.
3:pears Load frm grapes pineapples    // This line should match.
5:LOAD FRMXYZ                         // This line should match.
6:IF ABCFORMLOADED THEN UNLOAD FRMPQR // This line should NOT match.
7:PEARS LOAD FRM GRAPES PINEAPPLES    // This line should match.
9:load frmxyz                         // This line should match.
10:if abcformloaded then unload frmpqr // This line should NOT match.
11:pears load frm grapes pineapples    // This line should match.

正しい。特別な「Wordの始まり」正規表現記号を使用します。行頭またはスペースに一致します。

大文字と小文字が区別されます:

C:\>type lines.txt | findstr /N /R /C:"\<Load frm"
1:Load frmXYZ                         // This line should match.
3:pears Load frm grapes pineapples    // This line should match.

または大文字と小文字を無視

C:\>type lines.txt | findstr /N /R /I /C:"\<Load frm"
1:Load frmXYZ                         // This line should match.
3:pears Load frm grapes pineapples    // This line should match.
5:LOAD FRMXYZ                         // This line should match.
7:PEARS LOAD FRM GRAPES PINEAPPLES    // This line should match.
9:load frmxyz                         // This line should match.
11:pears load frm grapes pineapples    // This line should match.
3
StackzOfZtuff