mycroftone
Goto Top

Leerzeichen am Ende eine Zeile Löschen. Leerzeichen im Rest der Zeile aber so bestehen lassen

Ich habe eine Datei die mit mehreren Spalten. Durch Leerzeichen sind die Einzelnen Einträge voneinander getrennt.
Es sind entweder 4 oder 5 Spalten. Und danach habe ich noch ein paar Leerzeichen.
Weil ich vorhere in manchen Zeilen was abschneiden mußte.

Jetzt möchte ich aber die Leerzeichen am Enden weg haben.

Ein
for /F "Tokens=1-5 " %%b in (C:\org.log) do  ( echo %%b,%%c,%%d,%%e,%%f >> C:\neues-org.log )  

Funktioniert ja nicht weil dann sind ja auch die Leerzeichen dazwischen weg.

ich habe mir schon gedacht ich nehm jede Zeile untersuch dort das letzt Zeichen und wenn es ein Leezeich ist nehem ich es weg.
Aber wie ich das Batch Programmiertechnis Umstzte weiß ich nicht.

Kann mir Jemand dabei helfen.

Content-ID: 184741

Url: https://administrator.de/forum/leerzeichen-am-ende-eine-zeile-loeschen-leerzeichen-im-rest-der-zeile-aber-so-bestehen-lassen-184741.html

Ausgedruckt am: 27.12.2024 um 14:12 Uhr

mak-xxl
mak-xxl 09.05.2012, aktualisiert am 18.10.2012 um 18:50:50 Uhr
Goto Top
Moin mycroftone,

etwa so für schließende (und führende!) Leerzeichen in einer Zeile:

@echo off
for /f "delims=" %%i in (C:\org.log) do @call :trim %%i  
goto :eof
:trim
echo [%*] >> C:\org.neu
goto :eof

Die Klammern in Zeile 5 für den Normalbetrieb entfernen - nur zur besseren Demonstration.

Der Dank geht an Biber - weil hier.

Freundliche Grüße von der Insel - Mario
57263
57263 09.05.2012 um 21:06:11 Uhr
Goto Top
ich mache so etwas so:
1. zunächst alle Stellen vielen Leerzeichen ungerader Zahl durch suchen & ersetzen gegen nichts: entfernt alle größeren Gruppen mit drei Zeichen restlos.
2. Immer so weiter bis zu kleinen Zahlen wie drei Leerzeichen
2. dann haben wir nur noch gerade Anzahlen von Leerzeichen. Die entfernen durch suchen & ersetzen zweier Leerzeichen gegen nichts.

OK?
bastla
bastla 09.05.2012 um 21:23:11 Uhr
Goto Top
@mario
Das Leerzeichen vor ">>" ist allerdings gerade in diesem Fall besonders kontraproduktiv - besser so:
>>C:\org.neu echo [%*]
- und darauf achten, dass es nicht am Ende dieser Codezeile noch eines gibt ...

Grüße
bastla
mak-xxl
mak-xxl 09.05.2012 um 21:42:38 Uhr
Goto Top
@bastla,

ja also die leergezeichneten Trittbrettfahrer und meiner einer - ein gefährliches Gespann.
Danke für die Korrektur.

Einen schönen Feierabend und freundliche Inselgrüße - Mario
gammaplayer
gammaplayer 10.05.2012 um 06:50:06 Uhr
Goto Top
Machst du das denn öfter und rechtfertigt es somit überhaupt ein Kommandozeilenscript?
Wenn du das öfter machst wäre n Skript natürlich sicherlich besser für ne automatische Verarbeitung.

Für nen Einzelfall würde ich in meinem Editor einfach das letzte Leerzeichen + Zeilenumbruch durch einen Zeilenumbruch ersetzen und gut ist.
Mit sed wäre das auch kein Problem ;)
Und ich nehme an, dass das mit nem Powershell-Skript auch kein Ding sein sollte.

Nur mal so als Denkanstoß.

Mit wilden Algorithmen zu gerader Anzahl von Leerzeichen tust du dir glaube nichts Gutes.

Achso ich sehe gerade dass am Ende mehrere Leerzeichen sein können, auch kein Ding mit regulären Ausdrücken.
Sollte in guten Texteditoren kein Thema sein und auch z.B. in der Powershell nicht, die sollte mit sowas umgehen können.
Bzw. könnte ich im Editor einfach Spaltenweise markieren und so die Leerzeilen loswerden, vorausgesetzt die Spalten sind gleich breit oder wurden durch Tabs getrennt.
Was mich zu der Frage führt woher die Daten überhaupt kommen und ob man nicht an der Daten erzeugenden Quelle schon für Verbesserungen sorgen könnte.

Fragen über Fragen... ist glaube noch zu früh. Mach mir schonwieder zuviele Gedanken über sone simple Sache. :D


Naja egal.... macht ihr mal face-smile


P.S. regulärer Ausdruck für ersetzen von Whitespace am Ende einer Zeile wäre dann "[[:s:]]*$" mit "\r\n" ersetzen. (ohne Änführungsstriche, Syntax kann sich unterscheiden, je nachdem wie/wo eingesetzt) Das ist jetzt Perl-Syntax innerhalb von UltraEdit. [[:s:]] = beliebiger Whitespace-Character, * = vorheriges Zeichen beliebig oft, $ = Zeilenende, "\r\n" = Carriage Return + Line Feed = neue Zeile unter Windows.
pieh-ejdsch
pieh-ejdsch 10.05.2012 um 14:14:33 Uhr
Goto Top
moin mycroftone,

... das Batch Programmiertechnis Umstzte ...
Wie Bugs Bunny?

Immer 5 tokens? Dann Schreibe statt Kommata die Leerzeichen.
Wenn nur vier oder fünf Tokens sein sollen, prüfe auf ein 5. Token.
@echo off
setlocal disabledelayedexpansion
if not exist "%~1" echo Datei nicht gefunden. 1>&2 &exit /b 1  
(for /f "usebackq tokens=1-5 delims= " %%a in (%1) do if "%%e" neq "" (echo %%a %%b %%c %%d %%e  
  ) else echo(%%a %%b %%c %%d
) >"%~dp1neues-%~nx1"  

Sonst lass die Unterroutine den Müll die Leerzeichen am Zeilenende entsorgen:
@echo off
setlocal disabledelayedexpansion
if not exist "%~1" echo Datei nicht gefunden. 1>&2 &exit /b 1  
findstr /n "^" %1 1>"%~1.tmp"  
(
for /f usebackqdelims^= %%a in ("%~1.tmp") do (set "Line=%%a"  
  call :Sub
))>"%~dp1neues-%~nx1"  
if exist "%~1.tmp" del "%~1.tmp"  
exit /b 0
:Sub
if "!OS!" neq "%OS%" setlocal enabledelayedexpansion  
if "!Line:~-1!" equ " " set "Line=!Line:~ 0, -1!" &goto :Sub  
echo(!Line:*:=!
goto :eof
[Edit] löschen der tmp-datei nachgetragen. [/Edit]

Gruß Phil
mycroftone
mycroftone 10.05.2012 um 14:51:44 Uhr
Goto Top
Vielen Dank für die zahlreichen Vorschläge.

Ich werde es morgen ausprobieren.

I
mycroftone
mycroftone 11.05.2012 um 13:02:55 Uhr
Goto Top
Danke an mak-xxl und Biber die Lösung funktioniert genauso wie gewünscht.

Danke auch an pieh-ejdsch für die UMsetzung meiner Idee.