正規表現で一致したもの以外を削除する方法(windows用ツール)が知りたいです。

簡単なツールほどポイントを上げます。
なお、vimで出来るのはわかっています。

例として
正規表現 abc|def|ghi

2aaa222bbb2
11abc111111
1111def1111
11ghi111ddd
22gggg22222

abc
def
ghi

のような形にしたいです。

※正規表現で一致したもの以外を削除する方法が知りたいのであり
例に対してこういう正規表現すれば解決できるよといった回答は
不要です。(実際ははるかに複雑なため)

宜しくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2008/12/02 20:48:34
  • 終了:2008/12/06 18:57:39

ベストアンサー

id:ardarim No.4

ardarim回答回数897ベストアンサー獲得回数1452008/12/02 23:53:14

ポイント40pt

JavaScriptで書いてみました。

適当なファイル名(例:re.js)で保存して

cscript /nologo re.js 入力ファイル名 "正規表現"

で実行できます。

結果をファイルに出力する場合はリダイレクトで。

cscript /nologo re.js 入力ファイル名 "正規表現" > 出力ファイル名

fso = WScript.CreateObject("Scripting.FileSystemObject");

fileName = WScript.arguments.item(0);
re = new RegExp(WScript.arguments.item(1), "g");

try {
    src = fso.openTextFile(fileName, 1, false, 0);
} catch(e){
    WScript.echo(e);
    WScript.echo("Failed to open '" + fileName + "'.");
    WScript.quit();
}

while(!src.atEndOfStream){
    t = src.readLine().match(re);
    if(!t) continue;
    WScript.echo(t.join(""));
}

src.close();
id:tikirou

この方法を利用させていただきました! ありがとうございました。

2008/12/06 18:56:12

その他の回答(3件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332008/12/02 21:09:36

ポイント10pt

Windows用のsedをお探しということでしょうか。

“簡単”の定義が分かりませんが、基本は下記のツールでしょう。

id:tikirou

UNIX関連には疎いのでsed使ったことはなかったので調べてみました。

-n -e オプション辺りを使えば 上記の動作が出来そうな感じですね。

2008/12/02 23:27:02
id:xcaqhbaj No.2

xcaqhbaj回答回数13ベストアンサー獲得回数12008/12/02 22:35:15

ポイント20pt

これなんか意図されてる動作をしそうです

http://www.forest.impress.co.jp/article/2005/08/10/okiniiri.html

本来はテスターみたいですが

id:tikirou

おお。これは意図通りの動作です! ファイルから読み込めない、出力できない以外は完璧な気がします。

ありがとうございました!

2008/12/02 23:27:01
id:hu2 No.3

hu2回答回数12ベストアンサー獲得回数02008/12/02 22:43:09

ポイント20pt

秀丸エディタで

まず

検索する文字列:(abc|def|ghi)

でgrepし、

その後、

検索:^.*(abc|def|ghi).*$

置換:\1

で置換を行えば可能かと思います。

id:tikirou

なるほど!この方法は思いつきませんでした。

最初にgrepで引っ張っておいてそのあとそれ以外を消すと。

ありがとうございました!

2008/12/02 23:26:59
id:ardarim No.4

ardarim回答回数897ベストアンサー獲得回数1452008/12/02 23:53:14ここでベストアンサー

ポイント40pt

JavaScriptで書いてみました。

適当なファイル名(例:re.js)で保存して

cscript /nologo re.js 入力ファイル名 "正規表現"

で実行できます。

結果をファイルに出力する場合はリダイレクトで。

cscript /nologo re.js 入力ファイル名 "正規表現" > 出力ファイル名

fso = WScript.CreateObject("Scripting.FileSystemObject");

fileName = WScript.arguments.item(0);
re = new RegExp(WScript.arguments.item(1), "g");

try {
    src = fso.openTextFile(fileName, 1, false, 0);
} catch(e){
    WScript.echo(e);
    WScript.echo("Failed to open '" + fileName + "'.");
    WScript.quit();
}

while(!src.atEndOfStream){
    t = src.readLine().match(re);
    if(!t) continue;
    WScript.echo(t.join(""));
}

src.close();
id:tikirou

この方法を利用させていただきました! ありがとうございました。

2008/12/06 18:56:12

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません