Shell-Skript: Teile eines Dokuments in anderen Prozess geben



  • Hallo,

    kann mir vielleicht ein Shell-Skript-Experte bei einem Problem weiterhelfen?

    Ich möchte ein Shellskript schreiben, das mir auf irgendeine Art markierte Teile eines Dokuments einem Programm in den Standard-Input übergibt. Es wird aber ein bisschen kniffliger: Die verschiedenen Teile aus dem Input-Dokument sollen zwar am Stück verarbeitet werden, aber danach trotzdem an die jeweiligen Stellen eingefügt werden...

    Um's mal ein wenig zu erklären:
    Das Inputdokument könnte als Trennzeichen "XX" verwenden.

    Wenn nun z.B. das Programm an jede Zeile "YY" anhängt, könnte folgendes passieren:

    Lorem ipsum dolor sit amet, consetetur 
    sadipscing elitr, sed diam nonumy 
    XX
    eirmod tempor invidunt ut labore
    et dolore magna aliquyam erat, sed 
    XX
    diam voluptua. At vero eos et accusam 
    et justo duo dolores et ea rebum. Stet 
    XX
    clita kasd gubergren, no sea takimata 
    XX
    sanctus est Lorem ipsum dolor sit amet.
    

    Würde zu folgendem weiterverarbeitet werden:

    Lorem ipsum dolor sit amet, consetetur 
    sadipscing elitr, sed diam nonumy 
    eirmod tempor invidunt ut labore[b]YY[/b]
    et dolore magna aliquyam erat, sed[b]YY [/b]
    diam voluptua. At vero eos et accusam 
    et justo duo dolores et ea rebum. Stet 
    clita kasd gubergren, no sea takimata[b]YY[/b]
    sanctus est Lorem ipsum dolor sit amet.
    

    Das Skript müsste also alle Zeilen zwischen den "XX" ersteinmal sammeln, dem Prozess übergeben und dann an der entsprechenden Stelle in das Ursprungsdokument einfügen und dieses dann wieder ausgeben...

    Versteht jemand was ich meine? 😃
    Gibt es dafür eine unkomplizierte Lösung oder wird das etwas komplizierteres?

    Grüße,
    Michael


  • Mod

    Hier in awk:

    {if ($0 == "XX") {in_block = xor(in_block,1)} else {if (in_block) {print $0 "YY"} else print}}
    

    Oder wenn man es wagt, Struktur in einen schönen awk-Einzeiler zu bringen:

    {
        if ($0 == "XX")
        {
             in_block = xor(in_block,1)
        } 
        else
        {
            if (in_block) 
            {
                print $0 "YY"
            } 
            else print
        }
    }
    

    Das Skript müsste also alle Zeilen zwischen den "XX" ersteinmal sammeln, dem Prozess übergeben und dann an der entsprechenden Stelle in das Ursprungsdokument einfügen und dieses dann wieder ausgeben...

    Wie du siehst: Nein. Es reicht, sich zu merken, ob man gerade im Block ist oder nicht.



  • Danke erstmal, das ist schonmal eine gute Spur 🙂

    Das mit dem "YY" war nur ein Beispiel der Einfachheit halber, ist aber wohl eher nach hinten losgegangen.

    Eigentlich soll in diesen Abschnitten Code in Skriptsprachen stehen können, die dann ausgewertet und an der Stelle (fertig ausgewertet) wieder eingefügt werden sollen. Deshalb ist es wichtig, dass es tatsächlich dieses In-Block gibt, falls weiter oben Variablen definiert wurden oder ähnliches.


Log in to reply