Batch mit sed - Zeilenumbruch?
Ich erstelle mit der Druckfunktion eines Programms eine ASCII Datei (ANSI) in der ich mit dem sed Befehl bestimmte Zeichen ersetzen und in eine neue Datei schreiben lasse. In dieser gibt es dann jedoch keinen Zeilenumbruch mehr. Dadurch ist der Aufbau der Datei total verändert.
Wie könnt ich das umgehen? Ich hab schon versucht am Ende jeder Zeile eine Variable auszugeben, die ich dann ebenfalls durch einen Zeilenumbruch ersetzen lasse.
Falls jemand eine Lösung mit der find funktion kennt: ich müsste ; S ; durch ; + ; und ; H ; durch ; - ; ersetzen.
Bin für jede Hilfe dankbar!
dol123
Wie könnt ich das umgehen? Ich hab schon versucht am Ende jeder Zeile eine Variable auszugeben, die ich dann ebenfalls durch einen Zeilenumbruch ersetzen lasse.
Falls jemand eine Lösung mit der find funktion kennt: ich müsste ; S ; durch ; + ; und ; H ; durch ; - ; ersetzen.
Bin für jede Hilfe dankbar!
dol123
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 64767
Url: https://administrator.de/contentid/64767
Ausgedruckt am: 23.11.2024 um 01:11 Uhr
17 Kommentare
Neuester Kommentar
Hallo dol123!
Sollte sich etwa so machen lassen:
Bitte beachten: Die neue Version ersetzt die ursprüngliche Datei - wenn nicht gewünscht, in die Zeile set "t=..." den neuen Dateinamen eintragen und die letzte Zeile ersatzlos streichen.
Grüße
bastla
Sollte sich etwa so machen lassen:
@echo off & setlocal enabledelayedexpansion
set "Datei=C:\test.txt"
set "Von1=; S ;"
set "Nach1=; + ;"
set "Von2=; H ;"
set "Nach2=; - ;"
set "t=%temp%\text.tmp"
if exist "%t%" del "%t%"
for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & set "Line=!Line:%Von1%=%Nach1%!" & set "Line=!Line:%Von2%=%Nach2%!" & echo !Line!>>"%t%"
move "%t%" "%Datei%"
Grüße
bastla
Meine Glaskugel ist gerade noch nicht vom polieren zurück....
Bist du mit sed unter Linux unterwegs oder sind es die Unixtools for Windows? Wie sieht denn dein Befehl/Script aus? Setzt du evtl. irgendwo das Newline in ein space um: The sequence \n matches a newline character in the pattern space, except the terminating new line.
geTuemII
Bist du mit sed unter Linux unterwegs oder sind es die Unixtools for Windows? Wie sieht denn dein Befehl/Script aus? Setzt du evtl. irgendwo das Newline in ein space um: The sequence \n matches a newline character in the pattern space, except the terminating new line.
geTuemII
Hallo dol123!
Gerade mit GNU sed version 3.02.80 (etwa von hier) mit folgender Zeile getestet und kein Problem entdeckt:
Grüße
bastla
P.S.: ... und ist natürlich eleganter als die Batch-Version.
Gerade mit GNU sed version 3.02.80 (etwa von hier) mit folgender Zeile getestet und kein Problem entdeckt:
sed "s/ S / + /";"s/ H / - /" test1.txt>test2.txt
Grüße
bastla
P.S.: ... und ist natürlich eleganter als die Batch-Version.
@bastla:
Ist schließlich auch ein UNIX-Tool Hybscher ist nur noch vi.
geTuemII
P.S.: ... und ist natürlich eleganter als die Batch-Version
Ist schließlich auch ein UNIX-Tool Hybscher ist nur noch vi.
geTuemII
Das "kleine Quadrat" ist der Zeilenumbruch, der wird nur unter Windows anders als unter Unix interpretiert. Daher mußt du das Unix-Newline durch ein Windows-Newline ersetzen, damit der Text zb. im Windows-Editor richtig dargestellt wird.
@bastla:
Hast du gerade die Zeichencodes im Kopf?
geTuemII
@bastla:
Hast du gerade die Zeichencodes im Kopf?
geTuemII
Hallo dol123!
Füge dem Batch von oben diese Zeile hinzu:
"findstr" kann mit "/n" Zeilennummern vergeben, und durch das Suchkriterium "." werden alle Zeilen berücksichtigt.
Bei jedem Schlelifendurchlauf wird die Nummer der aktuellen Zeile in der Variable ANZ (durch das "/a" wird diese als numerisch deklariert) gespeichert, so dass nach dem letzten Durchlauf die Nummer der letzten Zeile gespeichert ist.
Grüße
bastla
Füge dem Batch von oben diese Zeile hinzu:
for /f "delims=:" %%i in ('findstr /n . "%Datei%"') do set /a ANZ=%%i
Bei jedem Schlelifendurchlauf wird die Nummer der aktuellen Zeile in der Variable ANZ (durch das "/a" wird diese als numerisch deklariert) gespeichert, so dass nach dem letzten Durchlauf die Nummer der letzten Zeile gespeichert ist.
Grüße
bastla
Hallo dol123!
Ich hatte Dich leider missverstanden ...
Die angegebene Zeile ermittelt die Anzahl und speichert sie (vorerst) nur in eine Variable. Dabei kann die Ausgangsdatei völlig unverändert bleiben (Zeilen müssen auch nicht mit "." enden).
Steht die von Dir angeführte Beispielszeile
tatsächlich so und als letzte Zeile in der Datei, und wenn ja, muss sie mitgezählt werden?
Grüße
bastla
Ich hatte Dich leider missverstanden ...
Die angegebene Zeile ermittelt die Anzahl und speichert sie (vorerst) nur in eine Variable. Dabei kann die Ausgangsdatei völlig unverändert bleiben (Zeilen müssen auch nicht mit "." enden).
Steht die von Dir angeführte Beispielszeile
30 ; ANZ ; 123456 ;
Grüße
bastla
Hallo dol123!
Mit etwas verändertem Algorithmus, aber hoffentlich gewünschtem Ergebnis, sieht der Batch jetzt so aus:
Grüße
bastla
Mit etwas verändertem Algorithmus, aber hoffentlich gewünschtem Ergebnis, sieht der Batch jetzt so aus:
@echo off & setlocal enabledelayedexpansion
set "Datei=C:\test.txt"
set "Von1=; S ;"
set "Nach1=; + ;"
set "Von2=; H ;"
set "Nach2=; - ;"
set "t=%temp%\text.tmp"
if exist "%t%" del "%t%"
set /a ANZ=0
for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & call :ProcessLine
move "%t%" "%Datei%"
goto :eof
:ProcessLine
echo %Line%|findstr /b "10 ; 33 ;">nul && set /a ANZ+=1
set "Line=!Line:%Von1%=%Nach1%!"
set "Line=!Line:%Von2%=%Nach2%!"
set "Line=!Line:ANZ=%ANZ%!"
(echo %Line%)>>"%t%"
Grüße
bastla