アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になっております。

表題の件について、質問させてください。
『とあるファイルに記述されている文字列を一部抜き出して、
別ファイルとして保存する』というバッチファイルを作成していますが、
うまく抜き出すことができないため、ご教示いただければ幸いです。

例)
・filelist.txt
.\aaa\aaa.txt
.\aaa\bbb.txt

上記ファイルに対し、「.\aaa\aaa.txt」の一行のみ取り出した
「aaafile.txt」というファイルを生成したいと考えております。
現在、私が考えたコマンドは下記になります。

for /f %%A in ('findstr /r /c:"aaa[^\\].*" filelist.txt') do echo %%A > aaafile.txt

このコマンドを実行すると、「.\aaa\bbb.txt」まで抽出してしまい、
意図通りとなりません。

初歩的なミスかもしれませんが、
何卒、よろしくお願いいたします。

A 回答 (3件)

>初歩的なミスかもしれませんが



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%A …

を見る事ですね。書式にあうように指定してください。

/r "abc" [file name]

となります。リテラルで正規表現を使うような仕様はめったにありません。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。

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

お礼日時:2013/11/09 02:51

やってみましたが、.\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: の意味ですが、"検索文字列" に空白が含まれると、「または」の意味になるので、空白をそのまま空白として扱いたいときにつけるものです。今回は空白が含まれないので不要。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。

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

お礼日時:2013/11/09 02:46

No1ですが、



https://www.google.co.jp/search?hl=ja&q=%E6%AD%A …

などと検索すればわかるかと。”正規化”と”リテラル”は語弊がありますが、反意後としてみる必要があります。

正規化とは、ある意味フォーマット抽象化して、そのフォーマットに合う物を探すときに、プログラム言語では使われます。もちろん、他の分野や言い回しによっては、違う意味がありますが、少なくともプログラム言語では、そのように使われます。

よく、”正規化する” ”ノーマライズする”と言う表現をします。これは、ある特定フォーマットに正すと言う事です。

その意味での”正規表現”です。


その反面、リテラルは、データーの文字列を直接指定する事になります。

https://www.google.co.jp/search?hl=ja&q=%E3%83%A …

のうち

http://e-words.jp/w/E383AAE38386E383A9E383AB.html

なんて、簡潔にそのことを説明しています。

「直接表記する際の書式」 は 「データーの文字列を直接指定する事になります。」です

何を、どのようにヒットさせたいかで、使い分ける事柄です。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています