Jump to content

Powershell - Textpassagen mit Zeilenumbruch löschen


Direkt zur Lösung Gelöst von Dukel,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo liebe Gemeinde,

 

ich bin zwar kein wirklicher Frischling mehr im Bereich scripting unter Powershell, aber seit einigen Tagen zermarter ich mir das Hirn wegen unten angegebenen Problems:

 

Ich habe eine config Datei mit folgendem Inhalt:

 

#Start_OF_test
  - name: test
    ipsum
    dolor
    bla
    bla
#End_OF_test

 

#Start_OF_test_new
  - name: test_new
    bla
    abc
    bla
    bla
#End_OF_test_new

 

Basierend auf einer Nutzereingabe soll nun entweder das Segment "test" oder "test_new" gelöscht werden.

Also im Endeffekt ( Nutzer hat "test" zum löschen angebeben ) soll es so aussehen:

 

#Start_OF_test_new
  - name: test_new
    bla
    abc
    bla
    bla
#End_OF_test_new

 

Das Problem ist das der Inhalt der einzelnen Segmente variieren kann, deswegen auch die Abgrenzung mit "#Start OF..." und "#End OF..."

 

Unter *nix würde folgender Befehl das gewünschte Ergebnis bringen:

sed "/#Start_OF_test/,/#End_OF_test/ d"

 

Wie bekomme ich das aber nun mit Powershell hin?

 

Dank und Gruß,

 

The Dodger

 

bearbeitet von the-dodger
typos
Link zu diesem Kommentar
Gerade eben schrieb NilsK:

Moin,

 

vermutlich ist die Antwort "Regular Expression", aber ich kann dir auf die Schnelle kein Beispiel geben.

 

Gruß, Nils

 

Tach auch,

 

War auch meine Idee, aber das führte leider nicht zum erwünschten Ergebnis:

 


$displayname = "test"

$sPat = "#Start_OF_$displayname(.*?)#End_OF_$displayname"

$string = get-content $importpath -ReadCount 0| select-string -Pattern $sPat | select -expand Matches | select -expand Value
$string

 

brachte nur folgendes:

 

#Start_OF_test   - name: test     ipsum     dolor     bla     bla #End_OF_test

 

Also den ganzen Text ohne Zeilenumbruch.

Habe trotzdem versucht, dieses zu verwenden mit folgendem Code:

 


(get-content "config.txt").replace($string,'') | out-file "config_new.txt"

 

aber nichts wurde verändert.

 

Dank und Gruß,

 

The Dodger

Link zu diesem Kommentar
  • Beste Lösung

Als Quick and Dirty geht evtl. folgendes:

# Eingabe einlesen oder festschreiben
$eingabe = read-host "test or Test_new"
$eingabe = 'test'
  
# Danach die Start / Stop Werte definieren
switch($eingabe){
   "test" {$start = '#Start_OF_test'; $end = '#End_OF_test'}
   "test_new" {$start = '#Start_OF_test_new'; $end = '#End_OF_test_new'}
}
$read = $true

# Datei einlesen und nur das benötigte ausgeben
Get-Content .\test.txt | % {
   if($_ -eq $start){ $read = $false }
   if($read){ $_ } # Hier evtl. in Datei ausgeben und ggf. trimmen, damit leere Zeilen nicht ausgegeben werden
   elseif($_ -eq $end){ $read = $true }
}

 

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...