[前の記事]« [WIN2000]ログオンユーザー名を取得するには?
[次の記事]ボリュームラベルと同名のディレクトリを作成したい »

関連オンラインソフト配布サイト:
Vector>ダウンロード(top) |>MS-DOSまたは汎用 | >WindowsVista/XP/2000/NT

▲カテゴリー「FIND,FINDSTR,SORT…テキストファイル内文字列の操作」索引へ
▲カテゴリー「SET, PATH, %環境変数%」索引へ
▲カテゴリー「文字列の操作」索引へ

「置換対象・置換文字列が可変」なファイル内文字列置換処理

711.
ファイルの文字列置換について(置換え文字列が可変の場合)
2005年08月29日(月) 19時58分
まっくす
●DOS/Windowsのバージョン↓
win2000 および、win2003server

はじめまして。まっくすです。

過去ログ391)ファイルの文字列置換についてを参照して、
バッチを記述していたのですが、環境変数の取り扱いで行きづまってしまいました。
どなたかご存知でしたらよろしくお願いいたします。

[やりたいこと]
置換対象ファイル名[kihon.txt]の中の置換対象文字列[bbb]を
置換後文字列[xxx]に変換した、置換後ファイル名[okikae.txt]を作成する


置換対象ファイル名[kihon.txt]
aaabbbcccaaabbbccc
$aaabbbccc$aaabbbccc
eeefffggg

↓処理実行

置換後ファイル名[okikae.txt]
aaaxxxcccaaaxxxccc
$aaaxxxccc$aaaxxxccc
eeefffggg

[行きづまっていること]
置換対象文字列
置換後文字列
が可変の場合の文字列置換用のSETコマンドのパラメータをうまく制御できません。

サンプルソース
※サンプルソースには、等掲示板でご活躍中のじゃく様のソースを参考に記述させて頂いております。
[yobidasshi.bat]※呼出用バッチ
replase.bat kihon.txt okikae.txt bbb XXX

[replase.bat]
rem **  引数1:置換対象ファイル名
rem **  引数2:置換後ファイル名称
rem **  引数3:置換対象文字列
rem **  引数4:置換後文字列

rem 引数の確認
if "%1"=="" goto ERROR
if "%2"=="" goto ERROR
if "%3"=="" goto ERROR
if "%4"=="" goto ERROR

type nul >%2
for /f "tokens=1* delims=" %%a in ( %1 ) do (set line=%%a && CALL :SUB %1 %2 %3 %4)

goto ENDEND

:SUB
set R=%line:%3=%4%   ←ここの置換用のパラメータがうまく作成できません。
echo %R%>>%2
pause
goto :EOF
EXIT /B 0

:ENDEND
EXIT /B 0


置換用setコマンドについて対象文字列が
固定でしたらset R=%line:bbb=xxx%と記述できるのですが、
可変なので、set R=%line:%3=%4%とすると、バッチ内部で「set R=3=XXX」と、%でくくる位置がずれてしまっています。
あたりまえのような気もしますが。。。

ながなが記述してしまいましたが、困っています。
どうぞよろしくお願いいたします。
712.
Re:ファイルの文字列置換について(置換え文字列が可変の場合)
2005年08月29日(月) 23時15分
じゃく
こんばんは

>●DOS/Windowsのバージョン↓
>win2000 および、win2003server
>
>可変なので、set R=%line:%3=%4%とすると、バッチ内部で「set R=3=XXX」と、%でくくる位置がずれてしまっています。
>あたりまえのような気もしますが。。。
>
こういうときは遅延環境変数の展開を有効にします。
setlocal /? や set /? をご参照ください。

[replase.bat]
rem **  引数1:置換対象ファイル名
rem **  引数2:置換後ファイル名称
rem **  引数3:置換対象文字列
rem **  引数4:置換後文字列

setlocal ENABLEDELAYEDEXPANSION ←遅延環境変数の展開を有効

rem 引数の確認
if "%1"=="" goto ERROR
if "%2"=="" goto ERROR
if "%3"=="" goto ERROR
if "%4"=="" goto ERROR

type nul >%2
for /f "tokens=1* delims=" %%a in ( %1 ) do (set line=%%a && CALL :SUB %1 %2 %3 %4)

goto ENDEND

:SUB
set R=!line:%3=%4! ←ここでlineの展開を実行時にする
echo %R%>>%2
pause
goto :EOF
EXIT /B 0

:ENDEND
EXIT /B 0

------------------------------------------------
以下は短いバージョンです。
[replase2.bat]
rem **  引数1:置換対象ファイル名
rem **  引数2:置換後ファイル名称
rem **  引数3:置換対象文字列
rem **  引数4:置換後文字列

setlocal ENABLEDELAYEDEXPANSION

rem 引数の確認
if "%1"=="" goto ERROR
if "%2"=="" goto ERROR
if "%3"=="" goto ERROR
if "%4"=="" goto ERROR

type nul >%2
for /f "tokens=1* delims=" %%a in ( %1 ) do (set line=%%a && set R=!line:%3=%4! && echo !R!>>%2 )
713.
Re:ファイルの文字列置換について(置換え文字列が可変の場合)
2005年08月30日(火) 10時25分
まっくす
じゃく様

おはようございます。まっくすです。
朝掲示板を確認して、じゃく様から返信を頂いていて感激でした!

まさに実現したかった機能でご回答を頂きありがとうございました。
遅延環境変数試してはいたのですが、その有効にする方法を間違っていたようです。
短いバージョンの方がソースがすっきりしますので、使わせて下さい!

またお世話になることがありましたらよろしくお願い致します。
714.
Re:ファイルの文字列置換について(置換え文字列が可変の場合)
2005年08月30日(火) 10時55分
じゃく
マックス様、おはようございます。

>短いバージョンの方がソースがすっきりしますので、使わせて下さい!

お役に立てて何よりです。

あと、余談ですが、replase→replaceですね?(投稿した後気づいた)

>またお世話になることがありましたらよろしくお願い致します。
こちらこそよろしくお願いします。
715.
Re:ファイルの文字列置換について(置換え文字列が可変の場合)
2005年08月30日(火) 12時44分
まっくす
まっくすです。

>あと、余談ですが、replase→replaceですね?(投稿した後気づいた)
ああ、重ね重ねお世話になります。この名前で納品するところだった。。。(笑)
じゃくさんありがとうございました!

あと一件気が付いたことがありますので、今後この書き込みを参照される方の為に
記述しておきます。

for /f "tokens=1* delims=" %%a in ( %1 ) do (set line=%%a&&set R=!line:%3=%4!&& echo !R!>>%2)
にした方がよさそうです。(ところどころスペースを削除して詰めてあります)
これをしないと、変換後の結果に無駄な空白が入ります。

以上です m(_ _)m
 
 


カテゴリー「FIND,FINDSTR,SORT…テキストファイル内文字列の操作」索引へ
カテゴリー「SET, PATH, %環境変数%」索引へ
カテゴリー「文字列の操作」索引へ

 

カテゴリー一覧

FPCU/FPCDIY QUICK LINK online
この上の各ジャンル名をクリックすると、下のウィンドウが切り替わります▼


=リンク集のインデックスはこちら=

資料書籍

About

2005年08月29日 10:32に投稿されたエントリーのページです。

ひとつ前の投稿は「[WIN2000]ログオンユーザー名を取得するには?」です。

次の投稿は「ボリュームラベルと同名のディレクトリを作成したい」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

This site is powered by Six Apart
Movable Type 3.33-ja
 
このブログについて | 運営:有限会社メディアポート