• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:バッチファイルの正規表現を利用した文字列検索)

バッチファイルで文字列検索・抽出する方法

このQ&Aのポイント
  • バッチファイルを使用して、指定したファイルから特定の文字列を抽出し、別ファイルとして保存する方法について質問させていただきます。
  • 具体的には、特定のファイルに記述されている文字列の中から一部を取り出し、新しいファイルに保存したいと考えています。
  • 現在、試したコマンドでは、予期しないファイルまで抽出されてしまうため、正確な抽出方法を知りたいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

>初歩的なミスかもしれませんが DOSには正規表現の処理はありません。よく、このカテゴリーに「正規表現」だけを示して投稿する馬鹿がいますが、プログラム言語や、スクリプト言語や、エンジン(シェルとか)とかインタプリターの仕様によって違います。似せて作ってあるだけで、それぞれのエンジンで解釈が違います。 なので、回答があっても、適当に書き込んでいるだけのようで、本来もっと別な、いいやり方があるけど、そういう馬鹿なやつらには、この程度いいと、みんなが思っているものです。 本題です。 DOSなど、シェルにはヘルプが付いています。特にCUIはUNIX時代から OnLine が充実していますので、まずそれを活用しましょう。 >cmd /? でDOSのシェルである cmd の仕様および使い方がでます。そこに正規表現の記述がありますでしょうか? 次に >for /? 出力される説明に正規表現がありますでしょうか? 無いですよね。なので正規表現は使えません。例としては findstr が使えます。使えると言うレベルでいると、コマンドのオプションで引数に該当する文字列を、正規表現で指定できる程度です。 >findstr /? で確認してください。 抜粋: /R 検索文字列を正規表現として使用します なんて仕様にあるので使えます。このような記述がないと使えません。 なお、 /c ですが、 /C:文字列 指定された文字列をリテラル検索文字列として使用します。 などとなっています。自分は /r で正規表現と勝手に思い込んでいるようですが、/c はリテラルとして処理されています。というより、エラーになっていませんか? リテラルと、正規表現は一緒には使えません。どちらからを指定することになります。 https://www.google.co.jp/search?hl=ja&q=%E3%83%AA%E3%83%86%E3%83%A9%E3%83%AB%E6%96%87%E5%AD%97%E3%81%A8%E3%81%AF&lr=lang_ja を見る事ですね。書式にあうように指定してください。 /r "abc" [file name] となります。リテラルで正規表現を使うような仕様はめったにありません。

fcknsho
質問者

お礼

ご回答ありがとうございます。 ご指摘の通り、/r "abc" [file name]と/c:を省いた書式でうまく動作しました。 勉強不足でご迷惑をおかけし、申し訳ありませんでした。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

やってみましたが、.\aaa\aaa.txt だけが抽出されます。何か勘違いがあるのでは? そもそも、 findstr /r /c:"aaa[^\\]" filelist.txt > aaafile.txt でいいのでは? for /f %%A in ('findstr /r /c:"aaa[^\\].*" filelist.txt') do echo %%A > aaafile.txt だと、マッチする行がもし複数行あるとecho毎にaaafile.txtが上書きされるので最後の行しか残りませんが。 なお、/c: の意味ですが、"検索文字列" に空白が含まれると、「または」の意味になるので、空白をそのまま空白として扱いたいときにつけるものです。今回は空白が含まれないので不要。

fcknsho
質問者

お礼

ご回答ありがとうございます。 おっしゃる通り、forで回す必要はありませんでした。 コマンドの理解が不十分で、申し訳ありません。

回答No.2

No1ですが、 https://www.google.co.jp/search?hl=ja&q=%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%A8%E3%81%AF&lr=lang_ja などと検索すればわかるかと。”正規化”と”リテラル”は語弊がありますが、反意後としてみる必要があります。 正規化とは、ある意味フォーマット抽象化して、そのフォーマットに合う物を探すときに、プログラム言語では使われます。もちろん、他の分野や言い回しによっては、違う意味がありますが、少なくともプログラム言語では、そのように使われます。 よく、”正規化する” ”ノーマライズする”と言う表現をします。これは、ある特定フォーマットに正すと言う事です。 その意味での”正規表現”です。 その反面、リテラルは、データーの文字列を直接指定する事になります。 https://www.google.co.jp/search?hl=ja&q=%E3%83%AA%E3%83%86%E3%83%A9%E3%83%AB%E6%96%87%E5%AD%97%E3%81%A8%E3%81%AF&lr=lang_ja のうち http://e-words.jp/w/E383AAE38386E383A9E383AB.html なんて、簡潔にそのことを説明しています。 「直接表記する際の書式」 は 「データーの文字列を直接指定する事になります。」です 何を、どのようにヒットさせたいかで、使い分ける事柄です。

関連するQ&A