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

-広告-

解決済みの質問

windows7でファイル内の一連の文字列を置換

Windows7を使用しており、テキストファイル内の特定の文字列(空白を含みます)の変換をしたく、簡単なバッチプログラムを作成したいのですが、色々NET内を検索しているのですが、自分の思っているものが見つかりません、下記の様な事をしたいのですが、SAMPLE.TXTの中に123456 SAMP1(6とSの間には空白を含みます)と999999 SAMP2(9とSの間には空白を含みます)の文字列があり、変換後には、
123456 SAMP1(6とSの間には空白を含みます)と999999 SAMP1(9とSの間には空白を含みます)に置換したいのです。全くの素人なので申し上げたい事がまとまりがないかもしれませんが、よろしくお願い致します。

SAMPLE.TXT(置換前)
123456 SAMP1
999999 SAMP2

SAMPLE.TXT(置換後)
123456 SAMP2
999999 SAMP1

投稿日時 - 2017-08-03 19:42:17

QNo.9359005

困ってます

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

powershellにはいくつかのバージョンがあります。
Windows7に標準装備されてるものは2.0のようですが、
そのバージョンか5.0にされているかでお助け内容はかわります。

私は、
batをそのまま実行するのではなく、コマンドプロンプトを
管理者権限で開いたあと、batのあるフォルダに移動し
その上で実行しました、その影響が出ているかもしれないです。
フォルダ移動(チェンジディレクトリ)は以下を参考ください。
https://www.k-tanaka.net/cmd/cd.php
エラーなどがあれば、それも表示されますので、
記述ミスなどが確認できると思います。

このサイトに半角¥を使うとクエスチョンマークに変換されてしまいます。
そのため、お伝えするために全角¥を使いました。
使用する¥記号は全て半角になおしてください。

また表示の設定やバージョンなどの影響で、半角¥が
半角\(逆スラッシュ)で表示される場合もあります。

" "と同じ意味をもつのが"¥s"です。(本来は¥は半角。sも半角)
この2文字が合わさり、powershellの正規表現の
半角スペースの意味になります。
他にも意味のある組み合わせがあります。
以下を参考ください。
http://mtgpowershell.blogspot.jp/2010/11/blog-post_18.html


前回ご案内しましたサンプルは、
batからpowershelを呼び出し、正規表現の置き換えをするものです。
たまたま私は似たようなことを試行錯誤した直後でした。
もしかすると、batやpowershellの基礎的なことを
ご案内すべきなのかもしれないですが、全てのご案内は
困難と思っています。
複数を組み合わせたものが上手く動作しないときは、
よりシンプルになおして試すと良いです。
今回でしたら、powershellのみで試してみるのもひとつの方法です。

投稿日時 - 2017-08-08 10:05:38

お礼

skp026様、
いつも、ご丁寧なご回答、ありがとうございました。

おかげさまで、目的を達する事ができました、素人の私にここまで辛抱強くご指導いただけました事に感謝致します。

投稿日時 - 2017-08-12 09:08:19

ANo.4

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

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

-広告-
-広告-

回答(4)

ANo.3

すみません。ANo.2で回答したものです。
忘れていたことを追記します。

PowerShellは、Windows7から標準で組み込まれています。
その際のバージョンは2.0です。
古いバージョンでも同じ記述ができるかは試していません。
とはいっても基本的なものなので、
エラーが出ても修正は可能と思います。

でも5.0で修正や改善がされてますからおすすめです。

投稿日時 - 2017-08-04 10:04:38

補足

skp026様、

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

画像を添付致しました、画像は見られますでしょうか?下記の様に理解してバッチファイルとPOWERSHLLのファイルと変換対象ファイルを同じディレクトリーに入れて、バッチファイルは右クリックで"管理者として実行"しましたが変換されませんでした。
また、全角の"¥"と"¥s"の取り扱いが解らず、半角の円マークにしたり半角のスペースにしたりしましたがだめでした、何か間違いはあるのでしょうか?
"¥" ---> "半角の¥" とか" "
"¥s"---> "半角の¥" ""

ちなみに、社内PCにPOWERSHELLは導入済みでした。

投稿日時 - 2017-08-08 08:55:57

お礼

skp026様、

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

画像を添付致しました、画像は見られますでしょうか?下記の様に理解してバッチファイルとPOWERSHLLのファイルと変換対象ファイルを同じディレクトリーに入れて、バッチファイルは右クリックで"管理者として実行"しましたが変換されませんでした。
また、全角の"¥"と"¥s"の取り扱いが解らず、半角の円マークにしたり半角のスペースにしたりしましたがだめでした、何か間違いはあるのでしょうか?
"¥" ---> "半角の¥" とか" "
"¥s"---> "半角の¥" ""

ちなみに、社内PCにPOWERSHELLは導入済みでした。

投稿日時 - 2017-08-08 08:56:00

ANo.2

bat内で、powershellを使うと実現可能です。
それも正規表現の検索置き換えできますので、
今回のように途中にスペースが入っていても検索できます。

以下はbatの例です。
=====ここから=====
powershell Set-ExecutionPolicy RemoteSigned
powershell .¥Replace-Content.ps1 -file ".¥Sample.txt" -rep1 "123456789¥ssample1" -rep2 "123456789¥ssample2"
powershell .¥Replace-Content.ps1 -file ".¥Sample.txt" -rep1 "999999999¥ssample2" -rep2 "999999999¥ssample1"
powershell Set-ExecutionPolicy Default
=====ここまで=====


文字数制限のため改行されています。
本来はpowershellを頭にして4行です。


実行には管理者権限が必要です。
例えばコマンドプロンプトで実行の場合はプロンプト開く時に
管理者権限を与えます。


ここのサイトの都合上(半角の¥は化ける)、
¥記号を半角ではなくわざと全角にしています。
実際には半角の¥に置き換える必要があります。


¥sが半角のスペースです。(これも本来は半角)
スペースのまま引数にすると、.ps1でうまく引数が取得できません。


.batと.ps1と.txtは、同一フォルダにあるものとしています。

以下はReplace-Content.ps1の中身
=====ここから=====
Param([string]$filepath, [string]$rep1, [string]$rep2)
$rep2 = $rep2 -replace "¥¥s"," "
$file_contents = $(Get-Content $filepath) -replace $rep1, $rep2
Set-Content $filepath $file_contents
=====ここまで=====


分かりにくくなるので、
エラー処理(例外処理)は、あえて入れていません。
また置き換え用の文字列の¥sは、そのままだとスペースに
ならなかったため、スペースに直しています。
もっとスマートな方法もあるかもしれないですが、
とりあえずの例としてご参考ください。


powershellは5.0で試しています。
powershellはMicrosoft純正のもので無料です。
インストールなどは以下が参考になると思います。
http://qiita.com/busonx/items/2ebca42866833516c772


たまたまですが私は最近、bat内で文字列置き換えが必要でした。
フリーソフトのコマンドもありましたが、いずれもいまひとつでした。
しかし、powershellの置き換えでは正規表現が使えます。
そして正規表現では行末や行頭のような指定の仕方もできます。
powershellも正規表現も、どちらも慣れておくと便利だと思います。

投稿日時 - 2017-08-04 06:14:28

補足

SKP026様、

早々のご回答ありがとうございました、早々に社内で"PowerShell"を調査いたしましたところ、社内では使用できないソフトウェアとして登録されておりました。
丁寧にご説明して頂き、解説もして頂いていたのでぜひつかわさせて頂きたかったのですが、大変申し訳ありません。ありがとうございました。

投稿日時 - 2017-08-04 09:52:43

お礼

SKP026様、

早々のご回答ありがとうございました、早々に社内で"PowerShell"を調査いたしましたところ、社内では使用できないソフトウェアとして登録されておりました。
丁寧にご説明して頂き、解説もして頂いていたのでぜひつかわさせて頂きたかったのですが、大変申し訳ありません。ありがとうございました。

投稿日時 - 2017-08-04 09:52:41

ANo.1

バッチぢゃないとダメなのでしょうか?
フリーウェアやWSHならググればすぐ出てきますが。。。

投稿日時 - 2017-08-03 21:07:39

補足

chachaboxx様、
ご回答ありがとうございます、はい、フリーウェアではあるかもしれません、しかし、社内で使用したく、社内でのフリーウェアの使用は禁止されている為にバッチで作成できればと思い投稿させて頂きました。
ちなみに、ネットにある、いろいろなサンプルのバッチを試しましたが、
SAMPLE1 -> SAMPLE2 の変換は可能ですが、123456 SAMPLE1 -> 123456 SAMPLE2のような単語では無く空白を含んだ単語を2個以上含んだ一連の文字列の返還ができなくて悩んでおります。

投稿日時 - 2017-08-04 05:27:02

お礼

chachaboxx様、
ご回答ありがとうございます、はい、フリーウェアではあるかもしれません、しかし、社内で使用したく、社内でのフリーウェアの使用は禁止されている為にバッチで作成できればと思い投稿させて頂きました。
ちなみに、ネットにある、いろいろなサンプルのバッチを試しましたが、
SAMPLE1 -> SAMPLE2 の変換は可能ですが、123456 SAMPLE1 -> 123456 SAMPLE2のような単語では無く空白を含んだ単語を2個以上含んだ一連の文字列の返還ができなくて悩んでおります。

投稿日時 - 2017-08-04 05:27:06

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-