仕事を頑張る人のおしりトラブル対策

お世話になります。

早速ですが、
「DOSバッチでテキストファイルの文字列置換を行うプログラム」がいろいろ紹介されていたので、
皆さんのプログラムを流用させていただき、勝手に継ぎ足したDOSバッチプログラムを以下の
ように作りました。

このDOSバッチで置換されたテキストファイルに2つの問題が発生して困っています。

問題 1)UNIXテキストファイルの改行コードがLFからCR+LFに変ってしまう。

    文字列置換した後にファイルサイズが大きくなっていたので発見しました。     

問題 2)空白行がなくなる。

    DOSプログラムでは、対応不可でしょうか?
    やはり、sed,awk,WHS,power shell を使わないと解決しませんか?

-(DOSプログラム f0.bat)------------------------------------------------------
::** @echo off

setlocal ENABLEDELAYEDEXPANSION

set fname=%1
copy /b %fname% org >nul
type nul >%fname%

for /f "delims=" %%a in (org) do (set line=%%a&&set l=!line:abc=xxx!&&echo !l!>>%fname%)
del org

goto end
:end
exit /b 0

-(実行時の標準出力結果 list)-----------------------------------------------

C:\>setlocal ENABLEDELAYEDEXPANSION
C:\>set fname=t22.txt
C:\>copy /b t22.txt org 1>nul
C:\>type nul 1>t22.txt
C:\>for /F "delims=" %a in (org) do (set line=%a && set l=!line:abc=xxx! && echo !l! 1>>t22.txt )
C:\>(set line=J0000000 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt )
C:\>(set line=HHH && set l=!line:abc=xxx! && echo !l! 1>>t22.txt )
C:\>(set line=519 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt )
C:\>(set line=2011-08-28 12:16:44.98302 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt )
C:\>(set line=2011-08-28 12:16:44.016114 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt )
C:\>(set line=0 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt )
C:\>(set line=abc && set l=!line:abc=xxx! && echo !l! 1>>t22.txt )
C:\>del org
C:\>goto end
C:\>exit /b 0

--(置換前 t22.org LF改行コード)--------------
J0000000
HHH
519

2011-08-28 12:16:44.98302
2011-08-28 12:16:44.016114
0
abc

--(置換後 t22.txt CR+LF改行コード)-----------
J0000000
HHH
519
2011-08-28 12:16:44.98302
2011-08-28 12:16:44.016114
0
xxxx

------------------------------------------
皆さんのご意見、ご指導をお待ちしてます。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

改行文字、空行、どちらの問題もバッチコマンド機能だけでは対応不可能です。



お書きのどれかのツールを使う必要があります。
VBScriptやJScriptならWindows標準装備なのでおすすめです。

VBScriptだと、下記のようなファイル foo.vbs を作って、

cscript //nologo foo.vbs < t22.org > t22.txt


====foo.vbs====================================================
Do While Not WScript.StdIn.AtEndOfStream
str = WScript.StdIn.ReadLine
WScript.StdOut.Write replace(str,"abc","xxx") & vbLF
Loop

この回答への補足

notnot さん、WSHでの動作確認ができました。

Windows Script Host Version 5.8と5.6でいくつかのVBScriptを作って実行してみましたが、
DOSだけで四苦八苦していたことが、かなり時間の無駄だったように思います。

Windows XP, Windows 7の両方で動作確認が取れたのでよかったです。
DOSの呪縛から解き放たれた気分です。

完結丁寧なアドバイス、ありがとうございました。

補足日時:2011/10/02 23:06
    • good
    • 0
この回答へのお礼

notnotさん お世話になります。

問題2)空白行の対応ができない段階で、私の目標が達成できないことになるので、
やはり、DOSオンリーをあきらめるのが妥当なんですね。

先ほど、GNU sed 4.2.1を個別にインストールして、UNIXのテキストの文字置換を
やってみたのですが、

sed -e s/adc/xxx/ t22.txt > t23.txt

を実行すると、

問題2)の空白行問題は、解決するのですが、問題1)の改行問題は解決しませんでした。
UNIXテキストファイルの改行LFが改行CR+LFに書き換わってました。

私が使っているPCのうち、
Windows XP SP3 は、Windows Script Host Verion 5.6
Windows 7 は、Windows Script Host Verion 5.8
が入っていましたので早速、取り組んでみます。

私が途中まで作ったファイルの解凍処理がバッチなので、このバッチの中から
WSHをコールするのは、

cscript //nologo foo.vbs < t22.org > t22.txt

で実行できますか?

あっ、自分で試してみます。
また、わからないことがあったら、ご質問させていただきます。

早速、WSHに取り組んでみます。

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

お礼日時:2011/10/02 20:48

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング