Macで一括置換を行うツールを探しています。


WindowsからMacにスイッチしたのですが、特定ディレクトリ内のファイルに対して一括置換(複数行)を行うためのツールが見つからずに困っています。
Windowsでは、「GrepReplace」(http://dhive.jp/dhappli/grepreplace.html)というフリーソフトを愛用していたのですが、同じようなソフトはないでしょうか?(有料でも構いません)

どうぞよろしくお願い致します。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/12/10 13:44:56
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.5

回答回数4973ベストアンサー獲得回数2154

ポイント100pt

コマンドで何でもできる、みたいなことを書いた手前、ちょっとやってみました。

まず、置き換えのための準備。

  • /Users/a-kuma3/rep/src.txt に、置き換える前の内容を書く
  • /Users/a-kuma3/rep/dest.txt に、置き換えた後の内容を書く
  • /Users/a-kuma3/rep/replace.rb というファイル名で、以下の内容を書き込む
data = STDIN.read

rep_src = open("/Users/a-kuma3/rep/src.txt").read
rep_dest = open("/Users/a-kuma3/rep/dest.txt").read

pos = data.index(rep_src)
if ! pos.nil? then
    data = data[0, pos] + rep_dest + data[pos + rep_src.length .. data.length]
end

puts data


で、置き換えは、以下のコマンド。

$ for f in `find /Users/a-kuma3/data -name "*.txt" -print` ; do mv ${f} ${f}.bak ; ruby /Users/a-kuma3/rep/replace.rb < ${f}.bak > ${f} ; done


あるディレクトリ(と、その下位ディレクトリすべて)内のファイル(拡張子を指定)に対して、

「あるディレクトリ」に相当するのは、find の直後の /Users/a-kuma3/data です。
「拡張子を指定」に相当するのは、-name の直後の "*.txt" です。
# 置き換えの必要が無くても、*.txt.bak ができちゃうのが、手抜き (^^;

以下、簡単な説明。

  • find コマンドは、あるディレクトリ (複数も可能) 配下のファイルを探す
  • for コマンドは、特定のコマンドを繰り返して実行する
  • ruby コマンドは、プログラムを動かすためのものです
    • replace.rb が、ファイルの内容を置き換えるプログラムです

ぼくは、perl とか苦手なので、ruby というコマンドを使っています (Mac OS X なら入っているはず) が、似たようなことは perl や php というコマンドでもできます。
画面を用意してませんが、テキストの置き換えくらいなら、このくらい短いコードを書くだけで、できちゃうんだよ、という例だと思ってください。
頑張れば、もっと複雑なこともできます。

プログラムに興味が無ければ、replace.rb の内容を理解する必要はないと思います。
人力検索で「こういうことをやる Excel のマクロを書いてくれ」という質問がときどきでてくるように、他のことをやりたくなったら、質問をあげれば、良いんじゃないかな、と。

# そのうち、自分で書きたくなるようになりますよ、きっと =)

id:dy7

なるほど。詳しい説明をありがとうございます!
perlやPHPは毎日のように使ってますので、自分でも書けそうです。
アプリを探すより、自作のスクリプトで処理すればイイという点、とても参考になりました!ありがとうございました!

2011/12/10 13:41:09
id:a-kuma3

perl いける方だったんですね。
だったら、シェルスクリプトは、すぐにちょちょいで書けるようになります。
まあ、ファイルを探すところから perl で書けるじゃん、って話もありますけど =)

2011/12/10 14:01:19

その他の回答4件)

id:degucho No.1

回答回数281ベストアンサー獲得回数75

ポイント20pt

自分も同じような乗り換えを検討していたので
探してみました。未使用なのでよかったら感想とか教えてください。

iSED/国産フリーSED GUI
http://homepage.mac.com/lightway/download/

Search & Replace/バージョン上がってシェアになったのかな?
http://search-and-replace.en.softonic.com/mac
http://www.macsoft.jp/posts/view/732

App Storeの商品
http://itunes.apple.com/jp/app/araxis-replace-in-files/id416511337?mt=12
http://itunes.apple.com/jp/app/find-replace-it!/id434067076?mt=12

id:dy7

回答ありがとうございます。
試してみます。

2011/12/05 10:10:14
id:NazeNani No.2

回答回数1615ベストアンサー獲得回数276

ポイント40pt

☆Mac用の日本語のフリーウェアで、
"多機能型リネームソフトShupapan"というのがあります。
MacOS 10.7(Lion)に暫定的に対応しています。
特定の条件と一致するファイルのみ文字列の追加/削除、
文字列の検索・置換、文字変換/言語変換等をすることができます。
また、複数の処理を組み合わせて実行することもできるようです。:
http://sunsky3s.s41.xrea.com/shupapan/features/index.html

☆専門ツールというよりは、テキストエディタの機能なのですが、
Mac用の"Jedit X"の「検索/置換機能」でも、特定ディレクトリ内の
複数のファイルをファイルセットで指定して、一括置換ができるそうです。
シェアウェアですが、無料で試用できます。日本語対応。:
http://www.artman21.com/jp/jedit_x/

☆英語の場合は、フリーで、"MassReplaceIt"という専用ツールがあります。:
http://www.hexmonkeysoftware.com/

id:dy7

回答ありがとうございます。
「Shupapan」は使ってたんですが、これってリネーム専用じゃないんですか?中身の検索・置換もできるのでしょうか?

2011/12/05 10:13:16
id:NazeNani

本文の方はJedit Xと連携させて使ったほうが良いと思います。

2011/12/05 10:37:45
id:kodairabase No.3

回答回数661ベストアンサー獲得回数80

id:dy7

回答ありがとうございます。
試してみます。

2011/12/05 10:13:29
id:a-kuma3 No.4

回答回数4973ベストアンサー獲得回数2154

ポイント20pt

これを機会に、コマンドでやることを覚える、というのはどうでしょうか?
いろいろなコマンドがあるので、いっぺんに覚えることは難しいですが、それだけいろいろなことができるということなので、柔軟性はかなりあります。

例として、/Users/a-kuma3 配下にある *.txt なファイルに対して、それぞれのファイルに含まれる foo を bar に全て置き換える場合です。
変換前のファイルを *.txt.bak という名前で残します。

unix ターミナルを開いて、以下のコマンドを打ちます。

$ for f in `find /Users/a-kuma3 -name "*.txt" -print` ; do mv ${f} ${f}.bak ; sed -e "s/foo/bar/g" ${f}.bak > ${f} ; done

最初の $ は、プロンプトで、最初から表示されている文字です。
長くて折り返してますが、for から、最後の done まで、続けて一行で打ち込みます。

他2件のコメントを見る
id:dy7

早速のご回答ありがとうございます。
例えば、あるディレクトリ(と、その下位ディレクトリすべて)内のファイル(拡張子を指定)に対して、20~30行くらいのコードを、同じくらいの行数のコードに置換したいのですが、やはり面倒ですよね?
理想の操作イメージとしては、置換前のコードと置換後のコードをそれぞれテキストボックスにペーストして、ディレクトリなどを選択してから、ボタン1個で置換完了!という形が良いのですが。。。(^^;

2011/12/10 01:10:27
id:a-kuma3

やはり面倒ですよね?

確かに、ちょっとは =)
長くなるんで、別の回答をおこしました。

2011/12/10 02:28:09
id:a-kuma3 No.5

回答回数4973ベストアンサー獲得回数2154ここでベストアンサー

ポイント100pt

コマンドで何でもできる、みたいなことを書いた手前、ちょっとやってみました。

まず、置き換えのための準備。

  • /Users/a-kuma3/rep/src.txt に、置き換える前の内容を書く
  • /Users/a-kuma3/rep/dest.txt に、置き換えた後の内容を書く
  • /Users/a-kuma3/rep/replace.rb というファイル名で、以下の内容を書き込む
data = STDIN.read

rep_src = open("/Users/a-kuma3/rep/src.txt").read
rep_dest = open("/Users/a-kuma3/rep/dest.txt").read

pos = data.index(rep_src)
if ! pos.nil? then
    data = data[0, pos] + rep_dest + data[pos + rep_src.length .. data.length]
end

puts data


で、置き換えは、以下のコマンド。

$ for f in `find /Users/a-kuma3/data -name "*.txt" -print` ; do mv ${f} ${f}.bak ; ruby /Users/a-kuma3/rep/replace.rb < ${f}.bak > ${f} ; done


あるディレクトリ(と、その下位ディレクトリすべて)内のファイル(拡張子を指定)に対して、

「あるディレクトリ」に相当するのは、find の直後の /Users/a-kuma3/data です。
「拡張子を指定」に相当するのは、-name の直後の "*.txt" です。
# 置き換えの必要が無くても、*.txt.bak ができちゃうのが、手抜き (^^;

以下、簡単な説明。

  • find コマンドは、あるディレクトリ (複数も可能) 配下のファイルを探す
  • for コマンドは、特定のコマンドを繰り返して実行する
  • ruby コマンドは、プログラムを動かすためのものです
    • replace.rb が、ファイルの内容を置き換えるプログラムです

ぼくは、perl とか苦手なので、ruby というコマンドを使っています (Mac OS X なら入っているはず) が、似たようなことは perl や php というコマンドでもできます。
画面を用意してませんが、テキストの置き換えくらいなら、このくらい短いコードを書くだけで、できちゃうんだよ、という例だと思ってください。
頑張れば、もっと複雑なこともできます。

プログラムに興味が無ければ、replace.rb の内容を理解する必要はないと思います。
人力検索で「こういうことをやる Excel のマクロを書いてくれ」という質問がときどきでてくるように、他のことをやりたくなったら、質問をあげれば、良いんじゃないかな、と。

# そのうち、自分で書きたくなるようになりますよ、きっと =)

id:dy7

なるほど。詳しい説明をありがとうございます!
perlやPHPは毎日のように使ってますので、自分でも書けそうです。
アプリを探すより、自作のスクリプトで処理すればイイという点、とても参考になりました!ありがとうございました!

2011/12/10 13:41:09
id:a-kuma3

perl いける方だったんですね。
だったら、シェルスクリプトは、すぐにちょちょいで書けるようになります。
まあ、ファイルを探すところから perl で書けるじゃん、って話もありますけど =)

2011/12/10 14:01:19

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

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

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

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

回答リクエストを送信したユーザーはいません