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

Alles rund um die verschiedenen Konsolen und shells sowie die Programmierung unter Linux

Moderator: Moderatoren

Antworten
Benutzeravatar
CIS
Newbie
Newbie
Beiträge: 29
Registriert: 27. Apr 2013, 12:01
Wohnort: Köln
Kontaktdaten:

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

Beitrag von CIS » 7. Sep 2017, 22:09

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: Alles auswählen

sed s/"Dokumenttitel"/""/g Textdatei
Mit dieser RegularExpression würde ich genau den Teil den Textes markieren, den ich gerne entfernen würde

Code: Alles auswählen

.*[\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 :)
Zuletzt geändert von CIS am 7. Sep 2017, 23:56, insgesamt 1-mal geändert.

Werbung:
abgdf
Guru
Guru
Beiträge: 2986
Registriert: 13. Apr 2004, 21:15

Re: Text beschneiden mit SED und Regular Expressions

Beitrag von abgdf » 7. Sep 2017, 22:21

CIS hat geschrieben:
7. Sep 2017, 22:09
In einer Textdatei sollen ab dem ersten Zeichen alle Zeichen bis einschließlich eines bestimmten Wortes entfernt werden.
Probier' mal:

Code: Alles auswählen

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.

Benutzeravatar
CIS
Newbie
Newbie
Beiträge: 29
Registriert: 27. Apr 2013, 12:01
Wohnort: Köln
Kontaktdaten:

Re: Text beschneiden mit SED und Regular Expressions

Beitrag von CIS » 7. Sep 2017, 22:29

Code: Alles auswählen

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: Alles auswählen

sed s/.*[\n].*[\n].*[\n].*[\n].*Schlusswort// Textdatei

Benutzeravatar
robi
Moderator
Moderator
Beiträge: 3141
Registriert: 25. Aug 2004, 02:13

Re: Text beschneiden mit SED und Regular Expressions

Beitrag von robi » 7. Sep 2017, 23:37

CIS hat geschrieben:
7. Sep 2017, 22:09
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: Alles auswählen

sed s/"Dokumenttitel"/""/g Textdatei
Mit dieser RegularExpression würde ich genau den Teil den Textes markieren, den ich gerne entfernen würde

Code: Alles auswählen

.*[\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: Alles auswählen

./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: Alles auswählen

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: Alles auswählen

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: Alles auswählen

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: Alles auswählen

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

Benutzeravatar
CIS
Newbie
Newbie
Beiträge: 29
Registriert: 27. Apr 2013, 12:01
Wohnort: Köln
Kontaktdaten:

Re: Text beschneiden mit SED und Regular Expressions

Beitrag von CIS » 7. Sep 2017, 23:55

Code: Alles auswählen

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

Benutzeravatar
robi
Moderator
Moderator
Beiträge: 3141
Registriert: 25. Aug 2004, 02:13

Re: Text beschneiden mit SED und Regular Expressions

Beitrag von robi » 8. Sep 2017, 00:13

CIS hat geschrieben:
7. Sep 2017, 23:55
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
Guru
Beiträge: 2986
Registriert: 13. Apr 2004, 21:15

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

Beitrag von abgdf » 8. Sep 2017, 00:54

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
Member
Beiträge: 54
Registriert: 10. Aug 2015, 16:42

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

Beitrag von MH1962 » 8. Sep 2017, 04:31

abgdf hat geschrieben:
8. Sep 2017, 00:54
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

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast