こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ファイルを開かずにテキストファイルの文字列置換

続けての投稿で申し訳ないのですが、複数のフォルダ中のテキストファイルすべての中身を検索してある文字列を置換する方法を教えてください。

行いたい作業例ですが、
1)ABC- → ABC-   ある特定の半角文字列+"-"を全角に変換
2)2ー → 2-      ある特定の文字列+"ー(全角の長音)"を文字列+"-(全角のマイナス)"に
3)192.168.0.?? → ABC0??
にしたいです。
フォルダは複数あるため、一階層上から作業できる方がいいです。
AAAというフォルダ下に先のABCというフォルダ以外にDEFやGHIといったフォルダがあり、その下に001-00.txtや001-01.txtというフォルダがあるということです。
よろしくお願いします。

投稿日時 - 2012-07-23 15:46:17

QNo.7606303

困ってます

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

No.2です。
とりあえず以下を前提に、具体的方法を示します。

1)については以下を前提にしています。
・「半角大文字アルファベット3文字」+「-」を対象にする。
・対象と一致する文字列は1行中に0~1回しか出現しない。
・対象は1行中の中間にあり、先頭や末尾ではない。
2)については以下を前提にしています。
・「全角数字」+「ー」(長音記号)を対象にする。
・対象と一致する文字列は1行中に0~1回しか出現しない。
3)「192.168.0.??」があったら「ABC0??」に置換する。

スクリプトとバッチファイルは以下の通りです。
《スクリプトtable.txt》
-----------------------------
s/[A-Z][A-Z][A-Z]-/\n&\n/
t conv
b end
:conv
h
s/\n...-\n/\n/
x
s/^..*\n\(...\)-\n..*$/\1-/
y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
G
s/^\(...-\)\n\(..*\)\n/\2\1/
:end
s/\([0-9]\)ー/\1-/
s/192\.168\.0\.??/ABC0??/
--------------------------------
【解説】
特定文字列を「半角大文字アルファベット3文字」+「-」とする。
「パターンスペース」とは置換などの編集作業ができる場所。
「ホールドスペース」とはデータを一時的に保管する場所。
各行の意味は以下の通りです。特定文字列以外の半角アルファベットを全角にしないように、込み入った手順を踏んでいます。
1)特定文字列があればその前後に改行マークをつける
2)置換が行われたらラベルconvに飛ぶ
3)そうでなければラベルendに飛ぶ
4)ラベルconv
5)パターンスペースの内容をホールドスペースにコピーする
6)特定文字列の箇所を削除する
7)パターンスペースとホールドスペースの内容を交換する
8)特定文字列以外を削除し、「-」を全角にする
9)特定文字列のアルファベットを半角から全角に変換する
10)パターンスペースのうしろにホールドスペースの内容を追加する
11)特定文字列の位置をもとにもどし、改行マークを削除する
12)ラベルend
13)全角数字のあとに「ー」があったら「-」に置換する
14)「192.168.0.??」を「ABC0??」に置換する

《バッチファイルconv.bat》
------------------------------------------------
cd ABC
c:\sed -f \AAA\table.txt 001-00.txt > 001-00.tmp
c:\sed -f \AAA\table.txt 001-01.txt > 001-01.tmp
c:\sed -f \AAA\table.txt 001-02.txt > 001-02.tmp
------------------------------------------------
作業フォルダをAAA、データ・フォルダをその下位のABCとしています。
ABCの箇所をDEFに書き換えれば、DEFのフォルダで変換を行います。
なお、出力先を入力元と同じ名前(上書き)にするとデータは消えてなくなりますので、ご注意を。

投稿日時 - 2012-07-25 01:11:15

お礼

試しているうちに時間がたってしまい申し訳ありません。
"ー"(長音)の処理が思い通りにならない場合があり???なのですが、ほぼ思い通りの結果が得られるところまで確認できました。
本当にありがとうございました。

投稿日時 - 2012-07-26 11:25:44

ANo.6

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.5

次は参考になりませんか。

http://www.oborodukiyo.info/PowerShell/v20/PS-RegexReplace.aspx

PowerShellでやる方法です。

投稿日時 - 2012-07-24 18:19:56

お礼

ありがとうございます。今回はNo.2の方の方法(No.6)で対処することにしました。

投稿日時 - 2012-07-26 11:17:47

ANo.4

No.2です。
> 2)例として挙げた文字列で、"ABC-"とあるのは、"-"の前に半角文字列がある場合、ハイフン込みで全角文字に、""2ー"とあるのは、"全角数字"+"ー"(長音)を"全角数字"+"-"(ハイフン)にしたいです。

前者の場合、「-」の前に半角アルファベット(A~Z)がちょうど3文字あるとき、その行すべての半角アルファベットを全角に変えてもかまわないのでしょうか? それとも直前の3文字に限って全角にするのでしょうか(それによって手順がだいぶ異なります)。
後者の「2ー」については
s/\([0-9]\)ー/\1-/
とすればご要望通りになるはずです。

データのご説明が具体性に欠けるので、これ以上なんとも申し上げられません。
「-」の前の半角文字の文字数は何文字ですか。アルファベット以外に数字・記号は含まれていますか。その文字列の前後に区切りとなる記号(たとえばカンマやスペース)はありますか。1行に複数回それが出てくることがありますか。

投稿日時 - 2012-07-24 17:19:40

ANo.3

No.1です。

>どちらも検索時点で"ー"(長音)がうまくヒットしてくれません。
同じ文字ならヒットするはずですが・・・
全角の良く似た文字になっていませんか?"ー","-","―","‐"など
Repl-Aceで正規表現を使えば混在していてもヒットすると思いますよ。
がんばってください。

投稿日時 - 2012-07-24 16:38:11

お礼

やはり"ー"(長音)と"―"(ダッシュ)が混在しているとうまく区別できないようで・・・
今回はNo.2の方(No.6)で対処中です。
ありがとうございました。

投稿日時 - 2012-07-26 11:21:07

ANo.2

テキスト・データを1行ずつ順に読み込んで処理して出力するストリーム・エディタというソフトがあります。いちばん有名なのがsed.exeです。これを使えば簡単に変換ができます。
●sed.exeの導入
下記からダウンロードして解凍したあと、sed.exeだけをルート・ディレクトリのc:\に置いてください。DOSのプログラムなので特にインストール作業は必要ありません。
http://www.vector.co.jp/soft/dos/util/se000880.html
(sed.exeはさまざまな開発者によって発表されており、いろいろな版がありますが、上記のものが使いやすいと思います)
●スクリプト
sedで処理する編集手順を記述したのがスクリプト(プログラム)です。
ご要望の変換内容がくわしくわからないので、質問内容のまま変換するスクリプトを例示します。
下記3行をフォルダAAAにtable.txtというテキスト・ファイルで保存します。
---------------------------
s/ABC-/ABC-/g
s/2ー/2-/g
s/192\.168\.0\.??/ABC0??/g
---------------------------
●バッチ・ファイル
実行させるためのバッチファイルを作成します。フォルダAAAに以下のような内容のテキスト・ファイルconv.txtを作成し、保存後、ファイル名をconv.batに変更します。
-------------------------------------------
c:\sed -f table.txt ABC\001-00.txt > ABC\001-00.tmp
c:\sed -f table.txt ABC\001-01.txt > ABC\001-01.tmp
c:\sed -f table.txt ABC\001-02.txt > ABC\001-02.tmp
-------------------------------------------
●変換
conv.batをクリックしてください。フォルダAAA\ABC内の指定されたファイルが変換されて拡張子.tmpとして生成されます。

スクリプトの記述を自分の目的に沿うように書き換えるには「正規表現」という規則に関する知識が必要です。たとえば「.」(ピリオド)は「任意の一文字」を表すので、ピリオドそのものを表すときには「\.」とします。

ご質問内容で以下のことを明確にしていただけば、さらに詳しいアドバイスができるかもしれません。
1)例に挙げている文字列は、1行の中の一部なのか、それで1行全体なのか。
2)「ある特定の文字列」というのは、対象の種類は多いのか、どのような規則性があるのか、どのような文字種からなっているのか(英数字、記号のみ?)。

投稿日時 - 2012-07-23 17:51:09

お礼

ご回答ありがとうございます。
少し試してからお礼しようと思ったのですが、sコマンドの基本がわかったところで挫折してます・・・アドバイスください。
1)例の文字列は、1行の中の1部です。だいたい1ファイル数千行の中に散らばってます。
2)例として挙げた文字列で、"ABC-"とあるのは、"-"の前に半角文字列がある場合、ハイフン込みで全角文字に、""2ー"とあるのは、"全角数字"+"ー"(長音)を"全角数字"+"-"(ハイフン)にしたいです。
よろしくお願いします。

投稿日時 - 2012-07-24 15:42:46

ANo.1

「Grep 置換」で調べてみて下さい。
私が使用しているMKeditorは、Grep検索できるのですが置換が
できませんでした。
なのでヒントだけでもと思い投稿してみました。
役に立てれば幸いです。

解説付のサイト
http://www.gigafree.net/tool/grep/

投稿日時 - 2012-07-23 15:54:21

お礼

ご回答ありがとうございます。
紹介していただいたサイトからMIGrepやRepl-Aceというソフトなら可能かと思ったのですが、どちらも検索時点で"ー"(長音)がうまくヒットしてくれません。
それ以外は何とかできそうです。

投稿日時 - 2012-07-24 15:03:15

あなたにオススメの質問