1

Windowsコマンドラインで、次で始まるすべての行をファイルで検索したい:

# NNN "<file>.inc"

ここNNNで、は数値と<file>任意の文字列です。

スクリプトのユーザーにackのインストールを要求できないため、findstrを使用したいと思います。

これが私が思いついた表現です:

>findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9_]*.inc" all_pre.txt

検索するファイルはですall_pre.txt

ここまでは順調ですね。次に、それを別のコマンド、たとえば、にパイプしますmore

>findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9]*.inc" all_pre.txt | more

この結果は前のコマンドと同じ出力ですが、すべての行のプレフィックスとしてファイル名が使用されます(all_pre.txt)。

次に来る:

FINDSTR: cannot open |
FINDSTR: cannot open more

なぜパイプが機能しないのですか?


all_pre.txtのコンテンツの一部

# 1 "main.ss"
# 7 "main.ss"
# 11 "main.ss"
# 52 "main.ss"
# 1 "Build_flags.inc"
# 7 "Build_flags.inc"
# 11 "Build_flags.inc"    
# 20 "Build_flags.inc"
# 45 "Build_flags.inc(function a called from b)"

編集:正規表現のドットもエスケープする必要があります。問題ではありませんが、言及する価値があります。

>findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9_]*\.inc" all_pre.txt

フランク・ボラックの後に編集:

>findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9_]*\.inc.*" all_pre.txt | more

は機能していませんが、(私が思うに)以前と同じ文字列を検索し、その後任意の文字を何度も検索する必要があります。それには、が含まれている必要がありますよね"

4

3 に答える 3

3

\"検索パターンの末尾が欠落しています。

findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9]*.inc\"" all_pre.txt | more

上記は私のために働きます。

編集:

findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9]*\.inc.*\"" all_pre.txt | more

この更新された検索文字列は、例の次の行と一致します。

# 1 "Build_flags.inc"
# 7 "Build_flags.inc"
# 11 "Build_flags.inc"
# 20 "Build_flags.inc"
# 45 "Build_flags.inc(function a called from b)"

編集:

のこの「バグ」を回避するためにfindstr、次のようなバッチファイルに検索を入れることができます。

@findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9_]*\.inc" %1

次のような名前を付けて、次のようmyfindstr.batに呼びます。

myfinsdtr all_pre.txt | more

これで、通常どおりパイプ演算子とリダイレクト演算子を使用できます。

お役に立てば幸いです。

于 2010-04-29T12:35:54.567 に答える
1

理由を実際に説明することはできませんが、私の経験から、findstr固定文字列(たとえば/c:"some string")での動作はまったく希望どおりですが、正規表現は別の獣です。私は日常的にこのような固定文字列検索機能を使用して、CSVファイルから行を抽出します。

C:\> findstr /C:"literal string" filename.csv >  output.csv

そこには問題はありません。

ただし、正規表現(たとえば/R "^\"some string\"")を使用すると、出力がコンソールに強制的に送信されるように見え、findstrどのような方法でもリダイレクトできません。、、、を試しまし>たが、正規表現を使用するとすべて失敗します。これに対する私の回避策は、findstrを2次コマンドとして使用することです。私の場合、私はこれを行いました:>>1>2>

C:\> type filename.csv | findstr /R "^\"some string\"" > output.csv

これは、非常に複雑な正規表現文字列を使用して、コマンドラインから直接問題なく機能しました。私の場合、それが機能するためには「」をエスケープするだけで済みました。、、などの他の文字は、エスケープせずに式のリテラルとして正常に機能しました。

Windows2008とWindows7の両方で動作が同じであることを確認しました。

編集:別のバリアントも明らかに機能します:

C:\> findstr /R "^\"some string\"" < filename.csv > output.csv

を使用するのと同じ原理typeですが、コマンドライン自体を使用してパイプを作成するだけです。

于 2013-06-03T04:34:59.963 に答える
0

偶数の二重引用符を含む正規表現を使用すると、完全に機能します。ただし、 "文字の数が奇数であるため、リダイレクトは機能しません。正規表現を2番目の引用符で完了するか(この目的で範囲を使用できます[\"\"]:)、引用符の文字をドットのメタ文字に置き換えることができます。

cmd.exeの問題のようですが、findstrは無罪です。

于 2018-03-22T07:56:55.863 に答える