sed Programm

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Mb81
Beiträge: 51
Registriert: 23.07.2004 19:08:57

sed Programm

Beitrag von Mb81 » 04.12.2005 01:25:30

Also, ganz simpel.

Ich habe nun folgende Zeile
<title lang="de">test test test</title>

Ich möchte nun, dass Sed <title lang="de"> und </title> mit irgendwas ersetz.
Ich glaub ich hab da einen Fehler gemacht, indem ich das Hochkommartar mit Suche einbezogen habe (muss warscheinlich formal anders gemacht werden).

Also, wäre klasse, wenn jemand Rat hat.

fuzzy
Beiträge: 1021
Registriert: 04.10.2003 12:15:52

Beitrag von fuzzy » 04.12.2005 09:38:58

Moin Mb81,
ich habe im Moment kein sed zur Verfügung und kann Dir leider keine getestete Tipps geben, daher "nur" diesen Link :wink:
http://www.linuxfibel.de/sed.htm

Gruß fuzzy

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 04.12.2005 09:52:44

Code: Alles auswählen

check@tne:~$  echo '<title lang="de">test test test</title>' | \
> sed -e 's#<title lang="de">#was anderes-#' -e 's#</title>#-ganz anders#'
was anderes-test test test-ganz anders
check@tne:~$ 
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Mb81
Beiträge: 51
Registriert: 23.07.2004 19:08:57

Beitrag von Mb81 » 04.12.2005 13:41:08

Savar hat geschrieben:

Code: Alles auswählen

check@tne:~$  echo '<title lang="de">test test test</title>' | \
> sed -e 's#<title lang="de">#was anderes-#' -e 's#</title>#-ganz anders#'
was anderes-test test test-ganz anders
check@tne:~$ 
Ok, preisfrage dann,
warum haut das hier nicht hin:

Code: Alles auswählen

grep -e programme -e title -e desc |\
 sed 's/"//g' |\
 sed 's/  <programme start=//g' |\
 sed 's/stop=/;/g' |\
 sed 's/showview=[0-9]*.[0-9]//g' |\
 sed 's/channel=/;/g' |\
 sed 's/>//g' |\
 sed 's/<title lang="de">/;/g' |\
 sed 's/<\/title>//g' |\
 sed 's/<desc lang="de">/;/g' |\
 sed 's/<\/desc>//g' |\
 sed 's/<\/programme>/EOL/g' > $Output

Mb81
Beiträge: 51
Registriert: 23.07.2004 19:08:57

Beitrag von Mb81 » 04.12.2005 13:44:41

Ausgangsausgabe könnte so aussehen:

Code: Alles auswählen

<tv>
  <programme channel="bbc2.bbc.co.uk" start="20010829000500 BST">
    <title>The Phil Silvers Show</title>
    <desc>
      Bilko claims he's had a close encounter with an alien in order
      to be given some compassionate leave so he can visit an old
      flame in New York.
    </desc>
  </programme>

  <programme channel="channel4.com" start="20010829095500 BST">
    <title>King of the Hill</title>
    <sub-title>Meet the Propaniacs</sub-title>
    <desc>
       Bobby tours with a comedy troupe who specialize in
       propane-related mirth.
    </desc>
    <credits>
      <actor>Mike Judge</actor>
      <actor>Lane Smith</actor>
    </credits>
    <category>animation</category>
  </programme>
</tv>

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 04.12.2005 13:49:35

was heißt "es klappt nicht" ?? Welche Fehlermeldung? Wo hakt es?

PS Verschoben von Grundsatzfragen
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
godsmacker
Beiträge: 902
Registriert: 16.03.2003 21:50:26
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: Chemnitz
Kontaktdaten:

Beitrag von godsmacker » 04.12.2005 14:40:04

Was mir zu diesem Thema spontan einfaellt ist: WTF?!

Wie waer's damit einen XML Parser zum XML parsen zu verwenden?


Gruesse,
Flo

Mb81
Beiträge: 51
Registriert: 23.07.2004 19:08:57

Beitrag von Mb81 » 04.12.2005 14:46:36

Nun, es gibt mir so was aus:

20051210152500 +0100 ;junior.tvtoday.de
<title lang=deFerris Bueller</title
<sub-title lang=deDas verhexte Traumauto</sub-title
</programme


und so sieht halt die Eingabe aus (als Beispiel):
<programme start="20051128231500 +0100" stop="20051129001500 +0100" showview="10-20-119" channel="rtl2.de">
<title lang="de">exklusiv - die reportage</title>
<desc lang="de">Außer Tresen nix gewesen - Wenn die Kneipe zum Wohnzimmer wird</desc>
</programme>

Nach der Channel parsing, ist also was falsch.

Mb81
Beiträge: 51
Registriert: 23.07.2004 19:08:57

Beitrag von Mb81 » 04.12.2005 17:27:59

Niemand der den Fehler sieht ? Es kann nur ein kleiner Fehler sein.

Also, die einzelnen Werte sollen nur durch Komma getrennt werden. Die Tags bleiben aber stehen.

fuzzy
Beiträge: 1021
Registriert: 04.10.2003 12:15:52

Beitrag von fuzzy » 04.12.2005 17:44:44

http://www.linux-fuer-alle.de/doc_show. ... 81&catid=8
darin enthalten ist praktisch

Code: Alles auswählen

sed 's/<[^>]*>//g' test.html > test-ohne-tags.txt
http://lists.suse.com/archive/suse-linu ... /1119.html

Gruß fuzzy

Mb81
Beiträge: 51
Registriert: 23.07.2004 19:08:57

Beitrag von Mb81 » 04.12.2005 18:09:57

fuzzy hat geschrieben:http://www.linux-fuer-alle.de/doc_show. ... 81&catid=8
darin enthalten ist praktisch

Code: Alles auswählen

sed 's/<[^>]*>//g' test.html > test-ohne-tags.txt
http://lists.suse.com/archive/suse-linu ... /1119.html

Gruß fuzzy
Bringt nichts..
Würde dann ja, nach jedem Tag ein Komma machen. Es soll ja nur einmal zum trennen der Inhalte gemacht werden. Wie ich das gemacht habe, ist es schon richtig.. es enthält aber einen kleinen Fehler, den ich leider bisher noch nicht gesehen habe...

fuzzy
Beiträge: 1021
Registriert: 04.10.2003 12:15:52

Beitrag von fuzzy » 04.12.2005 18:17:49

Hallo Mb81,
kannst Du bitte nochmal eine kleine beispielhafte "Testeingabe" und eine "Testausgabe" geben, bzw. so wie die 'Testausgabe" aussehen soll.

So etwas ist nicht richtig?

Code: Alles auswählen

fuzzy@sid:/tmp$ cat test.html 
 <programme start="20051128231500 +0100" stop="20051129001500 +0100" showview="10-20-119" channel="rtl2.de">
<title lang="de">exklusiv - die reportage</title>
<desc lang="de">Außer Tresen nix gewesen - Wenn die Kneipe zum Wohnzimmer wird</desc>
</programme> 

fuzzy@sid:/tmp$ sed 's/<[^>]*>//g' test.html
 
exklusiv - die reportage
Außer Tresen nix gewesen - Wenn die Kneipe zum Wohnzimmer wird
 
Gruß fuzzy

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 04.12.2005 18:18:46

wie wäre es dann mit

Code: Alles auswählen

sed -e 's/<[^>]*>/,/g' Datei | sed -e 's/,,/,/g'

Mb81
Beiträge: 51
Registriert: 23.07.2004 19:08:57

Beitrag von Mb81 » 04.12.2005 18:29:24

fuzzy hat geschrieben:Hallo Mb81,
kannst Du bitte nochmal eine kleine beispielhafte "Testeingabe" und eine "Testausgabe" geben, bzw. so wie die 'Testausgabe" aussehen soll.

So etwas ist nicht richtig?

Code: Alles auswählen

fuzzy@sid:/tmp$ cat test.html 
 <programme start="20051128231500 +0100" stop="20051129001500 +0100" showview="10-20-119" channel="rtl2.de">
<title lang="de">exklusiv - die reportage</title>
<desc lang="de">Außer Tresen nix gewesen - Wenn die Kneipe zum Wohnzimmer wird</desc>
</programme> 

fuzzy@sid:/tmp$ sed 's/<[^>]*>//g' test.html
 
exklusiv - die reportage
Außer Tresen nix gewesen - Wenn die Kneipe zum Wohnzimmer wird
 
Gruß fuzzy
Sollte dann wohl,

20051128231500 +0100 ;20051129001500 +0100 ;10-20-119 ;rtl2.de ;exklusiv - die reportage ; Außer Tresen nix gewesen - Wenn die Kneipe zum Wohnzimmer wird

geben.

Mb81
Beiträge: 51
Registriert: 23.07.2004 19:08:57

Beitrag von Mb81 » 04.12.2005 18:32:44

Joghurt hat geschrieben:wie wäre es dann mit

Code: Alles auswählen

sed -e 's/<[^>]*>/,/g' Datei | sed -e 's/,,/,/g'
Hmm.. hast das erste Komma und das letzte dann aber vergessen ?

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 04.12.2005 18:38:12

Es funktioniert ja auch nicht immer, z.B. wenn zwischen zwei Tags ein newline ist.

Warum musst du das so genau haben? Und warum benutzt du dann nicht, wie schon vorgeschlagen, einfach einen XML-Parser? z.B. den xml.dom.minidom Parser von Python?

Mb81
Beiträge: 51
Registriert: 23.07.2004 19:08:57

Beitrag von Mb81 » 04.12.2005 18:48:02

Joghurt hat geschrieben:Es funktioniert ja auch nicht immer, z.B. wenn zwischen zwei Tags ein newline ist.

Warum musst du das so genau haben? Und warum benutzt du dann nicht, wie schon vorgeschlagen, einfach einen XML-Parser? z.B. den xml.dom.minidom Parser von Python?
Muss halt so sein. Da würde mir ein XML Parser nicht groß helfen...

Ich probiere das mal als nächstes:

grep -e programme -e title -e desc |\
sed 's/"//g' |\
sed 's/ <programme start=//g' |\
sed 's/stop=/;/g' |\
sed 's/showview=[0-9]*.[0-9]//g' |\
sed 's/channel=/;/g' |\
sed 's/*.[a-zA-Z]>//g' |\
sed 's/<title lang="de">/;/g' |\
sed 's/<\/title>//g' |\
sed 's/<desc lang="de">/;/g' |\
sed 's/<\/desc>//g' |\
sed 's/<\/programme>/EOL/g' > $Output

Aber wie gesagt... vielleicht sieht ja jemand den Fehler vor mir.

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 04.12.2005 21:08:56

als erstes solltest mal Code auch in Code - Tags zu schreiben :?

dann optimiert man erstmal und ich frag mich grad wieso du auf "<programme start" suchst, denn es ist doch "<programme channel" ?? (das hab ich mal geändert) und so genau weiß ich immer noch nicht was du raushaben willst... poste doch einfach mal ein stück von deinem Ausgansfile und dann ein stück wie es aussehen soll NACH NoPaste

Code: Alles auswählen

 grep -e programme -e title -e desc |\
sed -e 's/\"//g' \
       -e 's/ <programme channel=//g' \
       -e 's/stop=/;/g' \
       -e 's/showview=[0-9]*.[0-9]//g' \
       -e 's/channel=/;/g' \
       -e 's/*.[a-zA-Z]>//g' \
       -e 's/<title lang="de">/;/g' \
       -e 's/<\/title>//g' \
       -e 's/<desc lang="de">/;/g' \
       -e 's/<\/desc>//g' \
       -e 's/<\/programme>/EOL/g' > $Output 
Zuletzt geändert von Savar am 04.12.2005 21:32:46, insgesamt 1-mal geändert.
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Mb81
Beiträge: 51
Registriert: 23.07.2004 19:08:57

Beitrag von Mb81 » 04.12.2005 21:25:18

Bei

Code: Alles auswählen

<programme start="20051128231500 +0100" stop="20051129001500 +0100" showview="10-20-119" channel="rtl2.de"> 
<title lang="de">exklusiv - die reportage</title> 
<desc lang="de">Außer Tresen nix gewesen - Wenn die Kneipe zum Wohnzimmer wird</desc> 
</programme> 
will ich das raus:

Code: Alles auswählen

20051128231500 +0100 ;20051129001500 +0100 ;10-20-119 ;rtl2.de ;exklusiv - die reportage ; Außer Tresen nix gewesen - Wenn die Kneipe zum Wohnzimmer wird 

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 04.12.2005 21:45:44

ist jetzt mehr als hässlich, geht aber..

Code: Alles auswählen

 |  sed \
     -e 's/<programme start="//' \
     -e 's/" stop=/ ;/g' \
     -e 's/" showview="/ ;/g' \
     -e 's/" channel="/ ;/g' \
     -e 's/"> *$//' \
     -e 's/<title lang="de">/;/g' \
     -e 's/<\/title>//g' \
     -e 's/<desc lang="de">/;/g' \
     -e 's/<\/desc>//g' \
     -e 's/<\/programme>/EOL/g' | gawk '{printf("%s",$0)}' | gawk '{ print $0 }'
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Mb81
Beiträge: 51
Registriert: 23.07.2004 19:08:57

Beitrag von Mb81 » 10.12.2005 22:01:41

Savar hat geschrieben:ist jetzt mehr als hässlich, geht aber..

Code: Alles auswählen

 |  sed \
     -e 's/<programme start="//' \
     -e 's/" stop=/ ;/g' \
     -e 's/" showview="/ ;/g' \
     -e 's/" channel="/ ;/g' \
     -e 's/"> *$//' \
     -e 's/<title lang="de">/;/g' \
     -e 's/<\/title>//g' \
     -e 's/<desc lang="de">/;/g' \
     -e 's/<\/desc>//g' \
     -e 's/<\/programme>/EOL/g' | gawk '{printf("%s",$0)}' | gawk '{ print $0 }'
Nope. Das klappt auch nicht. Ich probiere es jetzt noch mal. Vielleicht sieht ja doch noch jemand den Fehler.

Antworten