ppm007
Goto Top

Batch: CRLF nach Suchen und Ersetzen in Datei

Habe öfters ein Text File in dem ich bestimmte strings ersetzen muss und dazu dieses Batch gefunden:

@echo on & setlocal enabledelayedexpansion
set "Datei=c:\noname.sx"     
set "Datei2=c:\noname.s19"     
set "Von=S725"    
set "Nach=S325"    
set "t=%temp%\text.tmp"     
if exist "%t%" del "%t%"     
for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & set Line=!Line:%Von%=%Nach%! & echo !Line!>>"%t%"     
move /y "%t%" "%Datei2%"   

Der zu ersetzende Text ist eindeutig und das Batch funktioniert auch.

Aber:
es fügt an das Ende jeder Zeile CRLF (Hex 20 20 0D 0A) hinzu, was kontraproduktiv ist.
Wie kann ich das vermeiden

Danke für alle Antworten

Content-ID: 671887

Url: https://administrator.de/forum/batch-crlf-nach-suchen-und-ersetzen-in-datei-671887.html

Ausgedruckt am: 15.04.2025 um 23:04 Uhr

BiberMan
BiberMan 12.03.2025 aktualisiert um 13:13:48 Uhr
Goto Top
https://stackoverflow.com/questions/7105433/windows-batch-echo-without-n ...

echo|set /p="Dein String ohne abschließenden Zeilenumbruch"
mbehrens
mbehrens 12.03.2025 um 13:19:04 Uhr
Goto Top
Zitat von @ppm007:

Wie kann ich das vermeiden

Nutze PowerShell mit einer passenden
(Get-Content -Path <file>).Replace (<von>, <nach>) | Set-Content <file>
Kombination.
ppm007
ppm007 12.03.2025 um 13:59:28 Uhr
Goto Top
von:
for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & set Line=!Line:%Von%=%Nach%! & echo !Line!>>"%t%"
nach:
for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & set Line=!Line:%Von%=%Nach%! & echo|set /p= !Line!>>"%t%"

funktioniert leider nicht, Datei hat Größe 0
BiberMan
BiberMan 12.03.2025 aktualisiert um 14:37:26 Uhr
Goto Top
funktioniert leider nicht
doch, so machen ...
@echo off & setlocal enabledelayedexpansion
set "Datei=c:\noname.sx"       
set "Datei2=c:\noname.s19"       
set "Von=S725"      
set "Nach=S325"      
set "t=%temp%\text.tmp"       
if exist "%t%" del "%t%"       
>"%t%" (for /f "usebackq delims=" %%i in ("%Datei%") do (  
    set "Line=%%i"  
    echo|set /p="!Line:%Von%=%Nach%!"  
))
move /y "%t%" "%Datei2%"  


Aber eher besser gleich die Powershell nehmen ...
[IO.File]::WriteAllText("C:\noname.s19",(Get-Content "C:\noname.sx" -raw).replace('S725','S325'))  
ppm007
ppm007 12.03.2025 um 15:01:56 Uhr
Goto Top
Danke
funktioniert leider auch nicht
jetzt hat ist in der Ausgabedatei alles in einer Zeile

mit Powershell habe ich keinen Verwandten
BiberMan
BiberMan 12.03.2025 aktualisiert um 15:17:21 Uhr
Goto Top
Zitat von @ppm007:
jetzt hat ist in der Ausgabedatei alles in einer Zeile
Wolltest du doch so, du wolltest die Zeilenenden entfernen... wie bitte willst du mehrere Zeilen voneinander "ohne" CRLF / LF trennen????, Zeilen werden Standardmäßig damit getrennt, ganz ohne geht es nicht, nur wenn es nur eine einzige Zeile ist dann schon ...
mit Powershell habe ich keinen Verwandten
face-big-smile ??

Ich sag nur Datei-Encoding, da bekommst du mit Batch wirklich Spaß ...
ppm007
ppm007 12.03.2025 um 16:10:23 Uhr
Goto Top
Im original file ist in Binär Ansicht kein CRLF 0x00000D0A vorhanden und die Zeilen sind im Editor untereinander,
und so soll das geänderte File auch aussehen.
Ich vergleiche Files mit dem Totalcommander und das funktioniert nicht wenn CRLF's drinnen sind oder alles
in einer Zeile steht.
BiberMan
BiberMan 12.03.2025 aktualisiert um 17:35:17 Uhr
Goto Top
und die Zeilen sind im Editor untereinander,
Dafür muss da aber mindestens ein LF (0x0A) (nach Linux Gusto) drin stehen,....
https://de.m.wikipedia.org/wiki/Zeilenumbruch

p.s. PS funktioniert auch simpel in Batch verwurstet 😋
@echo off
powershell -EP Bypass -C "[IO.File]::WriteAllText('C:\noname.s19',(Get-Content 'C:\noname.sx' -raw).replace('S725','S325'))"  
DivideByZero
DivideByZero 12.03.2025 um 17:47:01 Uhr
Goto Top
Was ist denn stattdessen in der Binär-Ansicht? Wenn kein CRLF, dann aber zwingend ein LF, wie soll das sonst gehen?
BiberMan
BiberMan 12.03.2025 aktualisiert um 18:16:00 Uhr
Goto Top
Oder man nimmt sed, das schlägt i.d.R. alle Varianten oben wenn Geschwindigkeit und Zuverlässigkeit trumpf ist.
sed 's/S725/S325/g' noname.sx >noname.s19  
Alles ist ehrlich gesagt besser als 80er Batch in solchen Belangen, das gehört langsam aber sicher mal ins Museum ...
ppm007
ppm007 13.03.2025 um 11:13:38 Uhr
Goto Top
Das Ausgangsfile hat in Binäransicht am Zeilenende 0x0D 0x0A

sed ist doch aus der Linux Welt, der Aufwand wäre zu hoch
BiberMan
BiberMan 13.03.2025 aktualisiert um 11:26:22 Uhr
Goto Top
Zitat von @ppm007:

Das Ausgangsfile hat in Binäransicht am Zeilenende 0x0D 0x0A
Also ein normaler Windows Zeilenumbruch, ergo brauchst du keinerlei Verrenkungen ...

@echo off & setlocal enabledelayedexpansion
set "Datei=c:\noname.sx"         
set "Datei2=c:\noname.s19"         
set "Von=S725"        
set "Nach=S325"        
set "t=%temp%\text.tmp"         
if exist "%t%" del "%t%"         
>"%t%" (for /f "delims=" %%i in ('type "%Datei%"') do (    
    set "Line=%%i"    
    echo.!Line:%Von%=%Nach%!
))
move /y "%t%" "%Datei2%"    
Ansonsten hat deine Datei evt. ein Encoding das du erst ermitteln und dann mit chcp umstellen musst.

sed ist doch aus der Linux Welt, der Aufwand wäre zu hoch
Ach watt ... das läuft problemlos auch unter Windows ...https://gnuwin32.sourceforge.net/packages/sed.htm
ppm007
ppm007 13.03.2025 um 11:17:35 Uhr
Goto Top
es muss weiter oben heissen 0x202020200D0A nicht 0x00000D0A
BiberMan
BiberMan 13.03.2025 aktualisiert um 11:20:27 Uhr
Goto Top
Zitat von @ppm007:

es muss weiter oben heissen 0x202020200D0A nicht 0x00000D0A

?? Die drei 0x20 sind halt nur drei zusätzliche Leerzeichen vor dem Zeilenumbruch. Was willst du eigentlich von uns? Wenn du die brauchst schreib sie halt mit ins echo ...
ppm007
ppm007 14.03.2025 um 18:28:56 Uhr
Goto Top
ich gebs auf, Danke an alle