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

Problem mit sed/grep

flyingt

Member
Hallo zusammen,
bin auf der Suche nach einem Shell Kommando.
Ich möchte aus einem html Skript etwas herausfiltern.
Ab einem bestimmtem Suchbegriff möchte ich mir ab diesem die nächsten 8 Zeilen anzeigen lassen.
Hat jemand eine Idee wie man das Problem lösen kann?
Danke schon mal für die Tipps.

lieben Gruss flyingt :D
 
OP
flyingt

flyingt

Member
hi,
habe nun im html-quellcode folgende darstellung : <..> meine Information <...> . Suche eine Anweisung, welche veranlaßt das alles zwischen folgender html-syntax : > ... < ausgelesen wird.

danke schon mal für die tipps
gruß
 

TeXpert

Guru
HTML ist übel zu parsen... insbesondere wenn Du mehrzeiler erlaubst...

schau Dir perl an und die fertigen parser-Module für HTML, ansonsten ist das ein trivialer sed:

Code:
s/VORHER\(TEXT\)NACHHER/\1/
für Vorher, Text und Nachher musst Du nur noch die passenden Regex entwerfen (Tipp: negativ denken da sed greedy matched)
 
OP
flyingt

flyingt

Member
dank dir, für deine rasche antwort,
ist aber leider nicht so einfach. arbeite mit einer suchmaschine, von welcher ich meine info beziehe, und wo die eingabe variabel ist und ich den text welcher gerfagt ist leider nicht kenne.

gruß
 
OP
flyingt

flyingt

Member
Danke schon mal für die bisherigen Tipps, haben auch alle geklappt. Meine bearbeitete Datei steht fast nur noch ein kleines Problem. Ich möchte jetzt aus der Datei folgendes : </a><br /> herauslöschen. habe es mit mit dem Befehl sed ' s/</a><br />//g' probiert. jedoch geht das nicht da er den / als shell syntax interpretiert. hat jemand vielleicht eine idee wie das zu realisieren ist. :?:

danke schon mal im voraus.
grüsse flyingt
 
flyingt schrieb:
habe es mit mit dem Befehl sed ' s/</a><br />//g' probiert. jedoch geht das nicht da er den / als shell syntax interpretiert.
Nö, der "/" wird nicht als Shell-Syntax, sondern als Trenner interpretiert.

Lösung: Verwende einfach einen x-beliebigen anderen Trenner.

Beispiele:
Code:
's@</a><br />@@g'
's|</a><br />||g'
's,</a><br />,,g'
'sX</a><br />XXg'
's%</a><br />%%g'
Merke: Als Trenner kann man (fast) jedes Zeichen benutzen, das nicht im Regulären Ausdruck vorkommt.
 

regexer

Advanced Hacker
traffic schrieb:
Lösung: Verwende einfach einen x-beliebigen anderen Trenner.
Oder maskiere die slashes entsprechend mit Backslash
Code:
sed 's/<\/a><br \/>//g'
Aber der von traffic vorgeschlagene Weg ist aber meiner Ansicht nach besser lesbar.
 
OP
flyingt

flyingt

Member
Danke, beide Wege führen zum Erfolg. 8) Jedoch möchte ich jetzt noch eine kleinigkeit rauslöschen dann habe ich das was ich brauche. Es soll alles raus gelöcht werden was zwischen 2 Spitzklammer steht. Also zum Beispiel <td width="125"> oder auch andere Ausdrücke zwischen spitzklammern. Habe es probiert folgend zu ersetzen aber es führt nicht zum erfolg. folgendes ptobiert: sed 's/<*>//g' Das * habe ich mal als Platzhalter für alles probiert aber es will nicht so recht. Ausserdem möchte ich alles was in einer zeile nach einem wort das in "...." steht rauslöschen. Also z. B. " hallo ich bin xx"ich heisse Nun möchte ich das ich heisse weg haben also was nach dem text in den " steht.
Noch mals vielen Dank für eure Hilfe.
Grüße flyingt
 

regexer

Advanced Hacker
flyingt schrieb:
Das * habe ich mal als Platzhalter für alles probiert aber es will nicht so recht.
Bei sed ist die Logik ein bisschen anders als in der Shell.
Probiere punkt-Stern. Das punkt steht für ein beliebiges Zeigen, der Stern "multipliziert" diesen Punkt. Beispiel:
Code:
~> echo '<td width="125">bla<td width="125">' | sed 's/<.*>//g'
Hier wird der gesamte string bis zum letzten > gelöscht, da sich sed immer den Größtmöglichen Treffer sucht. Um das zu vermeiden probiere:
Code:
~> echo '<td width="125">bla<td width="125">' | sed 's/<[^>]*>//g'
bla
Hier überlebt das bla, weil ich von < alle Zeichen lösche, die nicht > sind sowie ein folgendes >. Vielleicht für den Anfang etwas verwirrend, aber es funktioniert!
 
OP
flyingt

flyingt

Member
:roll: Ja schon etwas verwirrend, aber danke für den Tipp darauf lässt sich aufbauen, habe es probiert aber es löst noch nicht so ganz mein problem. Aber habe noch etwas dazu im Buch gefunden, wenn ich hinbekomme melde ich mich.

Sagt mal kann ich das auch auf das problem beziehen wenn ich alles nach den anführungszeichen weggelöscht haben will benutzen. Also wen jetzt da steht "Buchhandlung Carolus"Bücherei und ich das was alles nach den "kommt weghaben will,also in diesem Besipiel Buchhandlung. Wie kann ich das realisieren. :?: [/quote]
 

regexer

Advanced Hacker
flyingt schrieb:
Sagt mal kann ich das auch auf das problem beziehen wenn ich alles nach den anführungszeichen weggelöscht haben will benutzen. Also wen jetzt da steht "Buchhandlung Carolus"Bücherei und ich das was alles nach den "kommt weghaben will,also in diesem Besipiel Buchhandlung.
Die musst dann die doppelten Hochkommas mit Backslash maskieren:
Code:
echo '"Buchhandlung Carolus"Bücherei' | sed 's/".*"//g'
Willst du alles zwischen den beiden Hochkommas löschen oder willst du nur das Wort Buchhandlung löschen? Arbeite am besten mit vorher-nachher-Beispielen. Sonst wissen wir nicht genau, was du willst...
 
OP
flyingt

flyingt

Member
Danke, aber ich möchte in der Zeile das gelöscht haben was nach den doppelten Hochkommas steht nicht das drinne, das ist was ich noch nicht so richtig hinbekommen
Code:
echo '"Buchhandlung Carolus"Bücherei' | sed 's/\".*\"//g'
Es bleibt übrig Bücheri. Es soll aber übrig bleiben Buchhandlung Carolus.

Dachte da eher an den Tipp von vorher mit
Code:
sed 's/<[^>]*>//'g

oder habt ihr eine andere idee?
Danke und gruss[/code]
 

TeXpert

Guru
flyingt schrieb:
Dachte da eher an den Tipp von vorher mit
Code:
sed 's/<[^>]*>//'g

oder habt ihr eine andere idee?
Danke und gruss[/code]

Die Idee ist schon richtig, [^X] ist ein Ausdruck für nicht X
also willst Du einen [^"] nutzen:

Code:
$ echo '"Buchhandlung Carolus"Bücherei' | sed 's/[^"]*$//g'
"Buchhandlung Carolus"
d.h. die längste Zeichenkette (sed ist greedy) die kein " enthält und am Ende der zeichenkette verankert ist ($) löschen -> Bingo.

u.U. ist es aber Sinnvoller nicht das unerwünschte zu löschen, sondern die gesamte Zeile zu matchen, Speicher zu nutzen und nur das Gewünschte wieder hinzusetzten:
Code:
echo '"Buchhandlung Carolus"Bücherei' | sed 's/[^"]*\("[^"]*"\)[^"]*/\1/g'
"Buchhandlung Carolus"
jetzt wird der gesamte String gematched (Annahme, es gibt genau 2 ")und mit \(..\) wird ein relevanter Teil gespeichert.
 
OP
flyingt

flyingt

Member
Leute ihr seid echt spitzenklasse. Das klappt auch jedoch habe ich löscht er mr dann alles aus dem text was nicht in doppelten hochkommas steht, jedoch will ich nur das gelöscht haben was in der zeilen nach den doppelten hochkommas steht.

sorry vielleicht hatte ich mich vorher falsch ausgedrückt.

Beispiel:

  • "Bücherei karolus" bücherei
  • westerbachstrasse 12
  • münchen
  • "bücherei hugendubel"bücherei
  • am markt 5
  • münchen

mit
Code:
sed 's/[^"]*$//g'
bleibt stehen bücherei karolus undbücherei hugendubel .
jedoch benötige ich auch die Adressinformation. es soll also stehen bleiben
  • "Bücherei karolus"
  • westerbachstrasse 12
  • münchen
  • "bücherei hugendubel"
  • am markt 5
  • münchen

noch mals danke für eure hilfe und zeit.
gruss flyingt
 

TeXpert

Guru
dann bastel mal schön ;) genug Tipps sollten ja hier sein bei konkreten Problemen kannst Du Dich ja wieder melden
 
OP
flyingt

flyingt

Member
:D Guten morgen zusammen. Habe es hinbekommen alles in der Zeile ausser das in den Hochkommas zu löschen. Ich danke euch für die nützlichen Tipps. War wirklich sehr hilfreich. Falls ich euch Profis mal helfen kann versuche ich mein bestes.

Gruss flyingt
 
OP
flyingt

flyingt

Member
guten morgen,
würde gerne meine übrig gebliebenen text noch in form bringen, also alle leer zeilen herauslöschen und den text an pos1 beginnen laßen.
habe mir selber eine sehr unschöne lösung gebastellt, wäre über jede schönere umsetzung dankbar.

bsp:
Mustername


  • Musterstr.11

  • 99999 Mustersatdt

umsetzung:

sed '2,3d' | sed '3d'
sed 's/.....//'



wird sehr unschön da es einige leere zeilen gibt, und der text wild verteilt ist aufm schirm, und man so alles einezeln behandeln muß!

danke schon mal für die tipps

gruß flyingt
 
Oben