• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Text beschneiden mit SED und Regular Expressions

CIS

Newbie
Hallo liebe Community 8)

Ich bin mit dem Werkzeug SED nicht wirklich vertraut, ein kleiner Hinweis eines Profis würde mir sehr weiterhelfen ;) Folgendes Szenario:

In einer Textdatei sollen ab dem ersten Zeichen alle Zeichen bis einschließlich eines bestimmten Wortes entfernt werden.

Dieser SED- Befehl würde das Wort "Dokumenttitel" entfernen und das Ergebnis ausgeben
Code:
sed s/"Dokumenttitel"/""/g Textdatei

Mit dieser RegularExpression würde ich genau den Teil den Textes markieren, den ich gerne entfernen würde
Code:
.*[\n].*[\n].*[\n].*[\n].+LetzterTeil

Es gelingt aber leider mir nicht, den RegularExpressionAusdruck in dem o.g. Befehl einzusetzen..... Vielleicht kann mir hier jemand einen guten Rat geben

Danke in voraus :)
 

abgdf

Guru
CIS schrieb:
In einer Textdatei sollen ab dem ersten Zeichen alle Zeichen bis einschließlich eines bestimmten Wortes entfernt werden.
Probier' mal:
Code:
sed s/.*Dokumenttitel// Textdatei
Ich muß dazu sagen, daß ich RegEx lieber vermeide (kann sein, daß da irgendwas Unerwartetes mit Gier passiert), und da mit Perl und split() rangehen würde.
 
OP
CIS

CIS

Newbie
Code:
sed s/.*Schlusswort// Textdatei
Danke für den Tipp, aber damit entferne ich lediglich die letzte Zeile, die nur das Schlusswort enthält.

Wenn ich versuche, den Ausdruck wie folgt zu erweitern, wird die Textdatei unverändert ausgegeben, wahrscheinlich weil es nicht matcht:
Code:
sed s/.*[\n].*[\n].*[\n].*[\n].*Schlusswort// Textdatei
 
A

Anonymous

Gast
CIS schrieb:
Ich bin mit dem Werkzeug SED nicht wirklich vertraut, ein kleiner Hinweis eines Profis würde mir sehr weiterhelfen ;) Folgendes Szenario:

In einer Textdatei sollen ab dem ersten Zeichen alle Zeichen bis einschließlich eines bestimmten Wortes entfernt werden.

Dieser SED- Befehl würde das Wort "Dokumenttitel" entfernen und das Ergebnis ausgeben
Code:
sed s/"Dokumenttitel"/""/g Textdatei

Mit dieser RegularExpression würde ich genau den Teil den Textes markieren, den ich gerne entfernen würde
Code:
.*[\n].*[\n].*[\n].*[\n].+LetzterTeil

Es gelingt aber leider mir nicht, den RegularExpressionAusdruck in dem o.g. Befehl einzusetzen..... Vielleicht kann mir hier jemand einen guten Rat geben

Das Pferd mal von hinten aufzäumen, ja warum nicht, also es ist ein Regulärer Ausdruck vorhanden, leider steht nicht dabei für welchen Tool dieser so bestimmt ist, das ist hier zumindestens bei dem + darin nicht ganz unbedeutend.
Code:
./txt2regex-0.8.sh  --showmeta

       awk       +       ?               |      ()
        ed      \+      \?    \{\}      \|    \(\)
     egrep       +       ?      {}       |      ()
     emacs       +       ?              \|    \(\)
    expect       +       ?               |      ()
      find       +       ?              \|    \(\)
      gawk       +       ?      {}       |      ()
      grep      \+      \?    \{\}      \|    \(\)
javascript       +       ?      {}       |      ()
       lex       +       ?      {}       |      ()
      lisp       +       ?             \\|  \\(\\)
      mawk       +       ?               |      ()
     mysql       +       ?      {}       |      ()
       ooo       +       ?      {}       |      ()
      perl       +       ?      {}       |      ()
       php       +       ?      {}       |      ()
  postgres       +       ?      {}       |      ()
  procmail       +       ?               |      ()
    python       +       ?      {}       |      ()
       sed      \+      \?    \{\}      \|    \(\)
       tcl       +       ?               |      ()
  vbscript       +       ?      {}       |      ()
        vi   \{1\}  \{01\}    \{\}            \(\)
       vim      \+      \=     \{}      \|    \(\)

NOTE: . [] [^] and * are the same on all programs.
egal wir nehmen mal die Regex-Regeln von sed, dort ist dieses ein einfaches +

Also suchen wir uns mal einen Text der zur Regex passt, da der orginale ja scheinbar hochgeheim ist.
Auf die Regex passt genau folgendes:

  • 4 Zeilen mit jeweils dem Zeilenendezeichen
    anschließen irgendwas (Nehmen wir "Z")
    danach "+"
    danach "LetzerTeil"
    und alles was dahinter kommt soll erhalten bleiben, (wir nehmen " Müllwagen soll stehen bleiben")
Code:
robi@ULTRA-01:~/rpmbuild/Grub> echo -e "asdf\ndfgh\nwert\nxcvb\nZ+LetzterTeil Müllwagen soll stehen bleiben"
asdf
dfgh
wert
xcvb
Z+LetzterTeil Müllwagen soll stehen bleiben
Und hier sehen wir schon ein Problem. sed arbeitet im Allgemeinen Zeilenweise, und du willst mehrere Zeilen auf einmal bearbeiten, Aber kein Problem, nur ohne dich mit sed zu beschäftigen wirst du das nicht so einfach verstehen.
entweder so hier in dem ich die 4 Zeilensprünge berücksichtige,
Code:
sed 'N;N;N;N;s/.*[\n].*[\n].*[\n].*[\n].+LetzterTeil//g'
oder so hier in dem ich wörtlich nehme
In einer Textdatei sollen ab dem ersten Zeichen alle Zeichen bis einschließlich eines bestimmten Wortes entfernt werden.
und von vornherein alles wegschneide bevor die Zeile mit dem "LetzterTeil" kommt.
Code:
sed -n '1,/LetzterTeil/s/.*LetzterTeil//gp'
das hätte aber die Nebenwirkung das hier nur diese eine Zeile ausgegeben wird, und eventuell weitere Zeilen nicht mehr.
dem könnte man dann wie folgt begegnen
Code:
sed '1,4d;s/.*LetzterTeil//g'

gibt wahrscheinlich noch ein paar Dutzend andere Möglichkeiten auch noch, müsste man aber ganz genau die Aufgabe und Bedingungen kennen.

robi
 
OP
CIS

CIS

Newbie
Code:
sed 'N;N;N;N;s/.*[\n].*[\n].*[\n].*[\n].*Schlusswort//g' Textdatei

:thumbs: Das hats gebracht. Besten Dank, Robi :)

nur ohne dich mit sed zu beschäftigen wirst du das nicht so einfach verstehen.
Da hast Du nicht wirklich unrecht.... ^^ Aber SED ist offenbar wirklich ein mächtiges Tool, sich das anzueignen lohnt sich bestimmt :D

für welchen Tool dieser so bestimmt ist
awk
 
A

Anonymous

Gast
CIS schrieb:
Da hast Du nicht wirklich unrecht.... ^^ Aber SED ist offenbar wirklich ein mächtiges Tool, sich das anzueignen lohnt sich bestimmt :D

Stell dir das mit sed-lernen nicht so leicht vor, die hast nur 28 Befehle die aus einem Schlüsselwort aus nur einem einzigem Buchstaben oder Zeichen bestehen, und nur 2 Speicherbereiche, keine Variablen, nichts. Da muss man gelegentlich schon mal den Kopf gehörig zum rauchen bringen, um einen logischen Weg zu finden mit dem man erreicht was man will.

Es gibt dafür für mich nur noch eine wirkliche Steigerung des Schwierigkeitsgrades. https://de.wikipedia.org/wiki/Brainfuck

robi
 

abgdf

Guru
Lern' lieber Perl. Da hast Du (weit) mehr davon, und Spaß macht es auch noch. :)

Ansonsten versteh' ich immer noch nicht, was Du genau machen willst, aber da robi schon ein paar Zahnstocher gepostet hat, brauch' ich es wohl auch nicht.
Grundsätzlich gehen diese Tools immer zeilenweise vor. Wenn man unbedingt über das Zeilenende hinaus editieren will, könnte man in Perl aber zusätzlich die ganze Datei auch in einen einzigen String einlesen. Und dann eine RegEx darauf loslassen - die Syntax ist im Prinzip die gleiche wie bei sed.
 

MH1962

Member
abgdf schrieb:
Lern' lieber Perl. Da hast Du (weit) mehr davon, und Spaß macht es auch noch. :)
Perl macht aber erst richtig Spaß, wenn man Regular Expressions richtig verstanden hat... und die kann man ganz gut mit sed üben... insofern hat er alles richtig gemacht... :D
 
Oben