Frage von KekseFuerAlle, 47

Wie kann man mit Batch eine Zeichenkette, welche zwischen 2 anderen Zeichenketten steht aus einer Variable löschen?

Tachchen, ich habe ein ähnliches Problem, wie in diesem Beitrag: https://www.gutefrage.net/frage/wie-kann-man-in-batch-eine-zeichenkette-welche-z...

Ich habe einen Satz, der in einer Variable abgespeichert ist. Dieser Text enthält zwei Zeichenfolgen und den Text zwischen diesen Zeichenfolgen will ich löschen lassen. Desweiteren ist die Zeichenfolge jedesmal mit 1-2 Zeichen anders (die aber immer an der selben stelle stehen). Also muss man wahrscheinlich mit Wildcards arbeiten, z.b. Fragezeichen. Lässt sich das mit Batch machen, oder muss man das mit Powershell machen? Wie würde das in Batch / Powershell aussehen?

Zum Beipiel:

Protokoll.T01.beliebigerzulöschenderText-Autor

Protokoll.T02.beliebigerzulöschenderText-Autor

etc ...

Ich hoffe da kann mir jemand weiterhelfen.

Gruß

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von Etter, 31

Das sollte funzen. Die Eingabe erfolgt über eine Textdatei (
test.txt im selben Ordner wie das Script), welche eingelesen wird.

Anschließend werden die einzelnen Zeilen jeweils gesplittet und in $StB wieder zu einem String zusammengefügt.

Anschließend wird der fertige String dann auf der Konsole ausgegeben ($StB). Diese Zeile kann man verändern, um eine entsprechende Weiterverarbeitung zu ermöglichen (in Array schreiben und in ne neue Textdatei schreiben z.B.).

Als Eingabe habe ich deine Beispielzeilen von oben in eine Textdatei (test.txt im selben Ordner wie das Script) geschrieben. Die Ausgabe:

Protokoll.T01-Autor
Protokoll.T02-Autor

Geschrieben ist das in Powershell. Falls du noch Fragen hast, einfach meine Antwort kommentieren ;)

$con = get-content .\test.txt

foreach($zeile in $con) {
$temp = $zeile.split(".");
$temp2 = $temp[2].split("-");
$StB = $temp[0]+"."+$temp[1]+"-"+$temp2[1]
$StB
}
Antwort
von PWolff, 35

Wenn der zu löschende Teil immer an derselben Position ist, ist es einfach.

Wenn z. B. die ersten 20 Zeichen mitgenommen, 5 Zeichen ausgelassen und der Rest wieder mitgenommen werden soll:

%variable:~0,20%%variable:~25%

(der Wert vor dem Komma gibt die Anzahl der zu überspringenden Zeichen an, der Wert nach dem Komma - falls vorhanden - die Anzahl der mitzunehmenden Zeichen. Wenn der erste Wert ausgelassen wird, wird 0 angenommen, wenn der zweite Wert ausgelassen wird, wird der Rest der Variablen bis zum Ende mitgenommen.)

Kommentar von KekseFuerAlle ,

Leider ist das damit nicht getan. Der zu löschende Text hat immer eine unterschiedliche länge und die Zeichenketten stehen auch nur immer pro Ausführung an der selben Stelle.

Das Script muss das also schon flexibel handhaben können, deswegen wäre so etwas fixes keine Lösung.

Kommentar von KekseFuerAlle ,

Damit "(die aber immer an der selben stelle stehen)" meinte ich, dass die Wildcards innerhalb der Zeichenfolge an der selben Stelle stehen würden.

Kommentar von PWolff ,

Das kriegt man mit Tricks auch hin. Ich hab da was gefunden: http://stackoverflow.com/questions/15494711/how-to-get-position-of-the-sub-strin...

das kann man so erweitern, dass die Position des Textes vor dem zu löschenden Text und die Position des Textes nach dem zu löschenden Text gefunden werden können und dann den Text dazwischen rausgeschnitten werden kann.

Es erfordert aber (soweit ich das sehe), dass eine Batch-Datei eine andere erzeugt und dann aufruft, möglicherweise bis in die 2. Ebene.

Kommentar von Etter ,

Warum so kompliziert?:'(

Kommentar von PWolff ,

Weil die Batch-Befehle nur für einfache Aufgaben entworfen worden sind. Es ist inzwischen viel mehr möglich als vor 20 Jahren, aber immer noch weit weniger als mit "großen" Sprachen. (Bzw. es ist extrem mühsam in Batch.)

Kommentar von Etter ,

Deswegen würd ich das halt net in Batch machen. Ich würde für so ziemlich nichts mehr Batch benutzen :/

Keine passende Antwort gefunden?

Fragen Sie die Community