

batで、あるファイル内の文字を置換するものを書いたのですが改行やスペースが消えてしまいます。  
解決方法をご教授ください。

[code]

    @echo off
    rem 元ファイルをtempにコピー
    copy %~n1.tex "%~n1"_temp.tex
    
    rem 元ファイルを削除
    del "%~n1.tex"
    
    setlocal enabledelayedexpansion
    for /f "delims=" %%a in (%~n1_temp.tex) do (
      set line=%%a
      set line=!line:。=. !
      set line=!line:、=, !
      echo !line! >> %~n1.tex
    )
    endlocal
    
[/code]


CC BY-SA 4.0
2018-12-30T10:38:38.110
51620
2019-01-01T05:44:58.330
2018-12-30T10:42:05.197
14745
31202
question
windows batch-file
batでテキストファイルの改行やスペースが消えてしまう


「改行やスペースが消えてしまいます」の詳細が不明なので、全てのデータに当てはまるか不明ですが、echo の書き方が原因と思われます。

[windowsの.batバッチファイルで文字列を置換する](https://qiita.com/wagase/items/2180d8911dcc2a748fd3)

> echoの都合で  
>  ・空行はなかったことにされる  
>  ・半角スペースしか無い行は echo off が出力される

さらに環境変数に代入した内容を出力していることで、以下が適用されるでしょう。

[コマンド別/echo](https://otnx.jp/CMD/%A5%B3%A5%DE%A5%F3%A5%C9%CA%CC/echo/)

> echoの直後に何かの記号を書くと良い。大抵の記号は大丈夫だが、よく見るのは . / : 等である。  
>  ただし、echo. 等とすると遅延展開を使う場合、 ! ! の間に , ; = の文字が入ると駄目である。  
>  ここで、echoの直後に書く記号を , ; = のいずれかを使うと大丈夫。

逆に出力結果に空白が付加されることもあるようです。

[バッチファイル | テキストファイルを 1 行ずつ読み込む
(完全版？)](https://blogs.yahoo.co.jp/kerupani/15344574.html)

> ６．おまけ: echo は かっこ で囲うといいかもしれない

上記を元に echo の行を以下のようにして試してみてください。  
まあかっこの有無や使う記号を変えるなど、色々試してみてください。

[code]

    (echo=!line!) >> %~n1.tex
    
[/code]

さらにここまで書いてきてナンですが、FOR /F は eol= のデフォルト値で行頭がセミコロンだと  
その行はコメント行として扱われスキップされるという機能があり、その回避が難しいようです。

[FOR /F その1 = FOR文でファイルを1行ずつ取り出して実行する方法 -
Windowsのコマンドプロンプト(bat,cmd)](http://tounderlinedk.blogspot.com/2011/05/for-f-1-for1-windowsbatcmd.html)

他にsetlocal enabledelayedexpansion を指定すると対象ファイル名に制限が付く等あるようです。  
[バッチファイルでの試行錯誤を回避するためのメモ](https://qiita.com/yz2cm/items/8058d503a1b84688af09)

@sayuriさんコメントのように、PowerShellにしてみるとか、編集や文字列処理に特化した sed や awk(gawk)
といったコマンドを使用してみるのが良いのではないでしょうか。  
[GNU utilities for Win32](http://unxutils.sourceforge.net/)


CC BY-SA 4.0
2019-01-01T02:03:32.270
51640
2019-01-01T02:03:32.270
26370
51620
answer


追加情報です。sedをbatで使う場合、おそらく一番手軽なのはgit bash を導入してしまうことです。  
セットアップ時にMinGWも一緒にいれてくれるので、普通にコマンドプロンプトから利用できるようになります。  
<https://gitforwindows.org/>


CC BY-SA 4.0
2019-01-01T05:27:32.960
51643
2019-01-01T05:44:58.330
2019-01-01T05:44:58.330
3060
10174
51620
answer