alme123
Goto Top

Per Batch in Dateizeilen nach Strings alles löschen

Hallo zusammen,

ich habe folgendes Problem:

ich habe eine sehr lange TextDatei (ca. 1300 Zeilen) in der folgendes steht (sehr kleiner Ausschnitt):

language.name=Deutsch
language.region=Deutschland
language.code=de_DE

gui.done=Fertig
gui.cancel=Abbrechen
gui.back=Back
gui.toMenu=Zurück zum Hauptmenü
gui.up=Hoch
gui.down=Runter
gui.yes=Ja
gui.no=Nein

Ein Batch (oder Vbscript) soll in allen Zeilen die "=" enthalten alles nach dem Gleichzeichen entfernen.

So sollte es danach aussehen:

language.name=
language.region=
language.code=

gui.done=
gui.cancel=
gui.back=
gui.toMenu=
gui.up=
gui.down=
gui.yes=
gui.no=


Vielen Dank im Vorraus,

Alme123

Content-Key: 206931

Url: https://administrator.de/contentid/206931

Ausgedruckt am: 28.03.2024 um 15:03 Uhr

Mitglied: Endoro
Endoro 23.05.2013 aktualisiert um 19:54:31 Uhr
Goto Top
Hallo Alme123,

wenn das nur ein kleiner Ausschnitt ist, was steht im restlichen Text: sind die Zeichenketten vor dem = unique? Gibts noch wo anders equal signs?

Gruss!
Mitglied: Alme123
Alme123 23.05.2013 um 19:58:14 Uhr
Goto Top
@Endoro

ja alle Zeichen vor dem = sind "normale" Textzeichen (also UTF-8 ohne BOM).
Nach dem = gibt es Sonderzeichen, vorher nicht.

Alme123
Mitglied: rubberman
rubberman 23.05.2013 aktualisiert um 20:35:26 Uhr
Goto Top
Hallo Alme123,

könnte so funktionieren:
@echo off &setlocal
set "txtfile=test.txt"  
set "newfile=neu.txt"  

setlocal EnableDelayedExpansion
<"!txtfile!" >"!newfile!" (  
  for /f %%i in ('type "!txtfile!"^|find /c /v ""') do for /l %%j in (1 1 %%i) do (  
    set "ln=" &set /p "ln="  
    if defined ln (
      for /f "delims==" %%k in ("!ln!") do echo %%k=  
    ) else (
      echo(
    )
  )
)

Grüße
rubberman
Mitglied: Endoro
Endoro 23.05.2013 aktualisiert um 23:20:12 Uhr
Goto Top
Ich hab es mal mit sed gebaut. Es wird eine Sicherheitskopie .bak angelegt:

@echo off&setlocal
sed  -i.bak "s/=.*/=/" file.txt  

Gruss!

PS: @rubberman: ich weiss ja nicht, ob @Alme123 Sonderzeichen im Text hat. Aber nachdem dein Code drübergelaufen ist, könnten es einige weniger sein face-wink
Mitglied: rubberman
rubberman 23.05.2013 um 22:06:48 Uhr
Goto Top
Hallo Endoro,

Sonderzeichen würde ich nicht unbedingt vor dem = erwarten. Falls doch, findet sich auch dafür eine Lösung face-smile

Grüße
rubberman
Mitglied: bastla
bastla 23.05.2013 um 22:33:51 Uhr
Goto Top
... und wenn's ein VBScript ist face-wink:
Ein = "D:\test.txt"  
Aus = "D:\neu.txt"  
Delim = "="  

Set fso = CreateObject("Scripting.FileSystemObject")  
T = Split(fso.OpenTextFile(Ein).ReadAll, vbNewLine)

For Each Z In T
    If InStr(Z, Delim) > 0 Then
        N = N & vbNewline & Split(Z, Delim)(0) & Delim
    Else
        N = N & vbNewline & Z
    End If
Next

fso.CreateTextFile(Aus).Write Mid(N, 3)
Grüße
bastla
Mitglied: Alme123
Alme123 24.05.2013 aktualisiert um 05:21:26 Uhr
Goto Top
@rubberman , @bastla und @Endoro

leider macht mir @rubberman 's Script mir die Datei kaputt (entfernt einfach Satzteile mit . vor dem =)
@bastla 's Script fängt nur die ersten Zeilen an und meint Feierabend zu haben.

@Endoro
sed möchte einfach nicht funktionieren, ich habe Windows 7 64 Bit.

Alme123
Mitglied: bastla
bastla 24.05.2013 aktualisiert um 09:09:11 Uhr
Goto Top
Hallo Alme123!
... fängt nur die ersten Zeilen an und meint Feierabend zu haben.
Du hast ja auch nur die ersten Zeilen gepostet ... face-wink

Was passiert denn genau, bis zu welcher Zeile (mit welcher Besonderheit) wird verarbeitet?

[Edit] Sollte Unicode ein Faktor sein, kannst Du es mit dieser Variante versuchen:
Ein = "D:\test.txt"  
Aus = "D:\neu.txt"  
Delim = "="  

Set fso = CreateObject("Scripting.FileSystemObject")  
T = Split(fso.OpenTextFile(Ein, 1, 0, 1).ReadAll, vbNewLine)

For Each Z In T
    If InStr(Z, Delim) > 0 Then
        N = N & vbNewline & Split(Z, Delim)(0) & Delim
    Else
        N = N & vbNewline & Z
    End If
Next

fso.CreateTextFile(Aus, 2, 1, 1 ).Write Mid(N, 3)
[/Edit]

Grüße
bastla
Mitglied: Endoro
Endoro 24.05.2013 aktualisiert um 08:17:56 Uhr
Goto Top
Zitat von @Alme123:
@Endoro
sed möchte einfach nicht funktionieren, ich habe Windows 7 64 Bit.

Hallo Alme123,

der Pfad zur sed.exe muss im Script oder dem %path% eingefügt werden.

Gruss!
Mitglied: Alme123
Alme123 24.05.2013 um 13:49:21 Uhr
Goto Top
@bastla

Fehler in deinem "Edit" Script: Zeile 6 Zeichen 1: Ungültiger Prozeduraufruf oder ungültiges Argument. Code: 800A0005

Die Datei sieht so aus: http://wormstates.pytalhost.com/de_DE.lang
Datei herunterladen und so bitte testen.


Alme123
Mitglied: Friemler
Friemler 24.05.2013, aktualisiert am 25.05.2013 um 15:11:53 Uhr
Goto Top
Hallo Alme123,

noch eine Powershell-Lösung gefällig?
$inFile = "D:\test.txt"  
$outFile = "D:\neu.txt"  

$regExp = new-object System.Text.RegularExpressions.Regex("(\S+=)(\S+)")  

if (test-path $outFile)
{
  remove-item $outFile
}

foreach ($line in get-content $inFile -encoding UTF8)
{
  $matches = $regExp.match($line)
  $newLine = ""  
  
  if ($matches.success)
  {
    $newLine = $matches.groups[1].captures.toString()
  }

  out-file -inputObject $newLine -encoding UTF8 -append $outFile
}

Ergebnis ist eine UTF8-Datei mit BOM. Wenn in Zeile 21 UTF8 durch Default ersetzt wird, wird eine ANSI-Datei geschrieben.


[EDIT]
... und wenn eine UTF8-Datei ohne BOM ausgegeben werden soll:
$inFile = "D:\test.txt"  
$outFile = "D:\neu.txt"  

$crlf = [System.Environment]::NewLine
$newContent = ""  

foreach ($line in get-content $inFile -encoding UTF8)
{
  if ($line.Contains("="))  
  {
    $newContent += $line.Split("=") + "=" + $crlf  
  }
  else
  {
    $newContent += $line + $crlf
  }
}

$encoding = new-object System.Text.UTF8Encoding($False)
[System.IO.File]::WriteAllText($outFile, $newContent, $encoding)
Diese Version arbeitet auch schneller, weil die Ausgabedatei in einem Stück geschrieben wird.
[/EDIT]


Gruß
Friemler
Mitglied: Alme123
Alme123 24.05.2013 um 14:40:57 Uhr
Goto Top
@Friemler

danke, dein Script funktioniert! (Mit der http://wormstates.pytalhost.com/de_DE.lang Datei)

Danke auch an @bastla und @rubberman ,

Friemler's Script funktionierte beim ersten mal perfekt (bei mir hat es erst so funktioniert: Powershell(.exe) öffnen und "Set-ExecutionPolicy RemoteSigned" eingeben)


Alme123

[Theard closed]
Mitglied: Friemler
Friemler 24.05.2013 um 14:47:57 Uhr
Goto Top
Hallo Alme123,

man kann das Script auch so aufrufen:
 powershell -nologo -executionpolicy remotesigned -file "Scriptpfad.ps1"
Dadurch wird die Ausführung von Powershell-Scripts nur temporär erlaubt.

Gruß
Friemler
Mitglied: bastla
bastla 24.05.2013 um 16:32:36 Uhr
Goto Top
Hallo Alme123!

Wenn Du gleich den Link zu dieser Datei gepostet hättest, anstatt alle Beteiligten raten zu lassen, ob und welche Formatierung / Sonderzeichen zu berücksichtigen wären (mein Script ist daran gescheitert, dass keine "Windows"-Zeilenschaltungen mit CR + LF, sondern nur LF verwendet werden), wäre das Thema gestern schon durch gewesen ...

... nicht zuletzt mit dieser Script-Version:
Ein = "D:\de_DE.lang"  
Aus = "D:\neu.txt"  
Delim = "="  

Set fso = CreateObject("Scripting.FileSystemObject")  
T = Split(fso.OpenTextFile(Ein).ReadAll, vbLf)

For Each Z In T
    If InStr(Z, Delim) > 0 Then
        N = N & vbLf & Split(Z, Delim)(0) & Delim
    Else
        N = N & vbLf & Z
    End If
Next

fso.CreateTextFile(Aus).Write Mid(N, 2)

Grüße
bastla
Mitglied: Endoro
Endoro 24.05.2013 um 17:01:20 Uhr
Goto Top
Hallo Alme123,

läuft mit sed auch prima in gefühlt 1/100 sec. durch face-smile

Gruss!