|
Menedas
Anmeldungsdatum: Sept. 1, 2005
Beiträge: 1032
|

27. Mai 2012 17:06
Ich bin gerade dabei ein Subtitle zu filtern und hänge gerade an diesem Beispiel hier fest: "SHE LAUGHS Come on, stop mucking about." Das "SHE LAUGHS " soll raus. Diese Deaf Infos stehen immer am Zeilenanfang und sind Großgeschrieben. Keine Ahung wer auf die Idee gekommen ist das so blöd in den Sub einzubauen. Jedenfalls überfordert das gerade meine schlechten regexp-Fähigkeiten. Ich hatte irgendwie an sowas hier gedacht:
sed -r 's/(^[A-Z]{2,}| )//' test
|
|
seahawk1986
Anmeldungsdatum: Okt. 27, 2006
Beiträge: 1115
Wohnort: München
|

27. Mai 2012 17:42
Menedas schrieb: Ich hatte irgendwie an sowas hier gedacht:
sed -r 's/(^[A-Z]{2,}| )//' test
Evtl. so:
sed -r -e "s/^([A-Z]{2,}\s)*//g" test
|
|
Menedas
(Themenstarter)
Anmeldungsdatum: Sept. 1, 2005
Beiträge: 1032
|

27. Mai 2012 18:05
| cat test
90
00:05:44,040 --> 00:05:46,160
Are you all right, mate?
91
00:05:49,080 --> 00:05:51,840
SHE LAUGHS Come on, stop mucking about
|
| sed -r -e "s/^([A-Z]{2,}\s)*//g" test
90
00:05:44,040 --> 00:05:46,160
all right, mate?
91
00:05:49,080 --> 00:05:51,840
on, stop mucking about.
|
Das entfernt also noch zu viel. Das Beispiel hätte ich vlt gleich mitposten sollen. Das ist auch das was ich nicht verstanden habe. denn mit {2,} sollte doch eigentlich das "Are" nicht mit rausgeschmissen werden.
|
|
seahawk1986
Anmeldungsdatum: Okt. 27, 2006
Beiträge: 1115
Wohnort: München
|

27. Mai 2012 18:16
Auf was für einem System bist du denn Unterwegs?
Bei mir sieht das auf einem Ubuntu Natty so aus:
~$ cat test_reg
90
00:05:44,040 --> 00:05:46,160
Are you all right, mate?
91
00:05:49,080 --> 00:05:51,840
SHE LAUGHS Come on, stop mucking about
~$ sed -r -e "s/^([A-Z0-9]{2,}\s)*//g" test_reg
90
00:05:44,040 --> 00:05:46,160
Are you all right, mate?
91
00:05:49,080 --> 00:05:51,840
Come on, stop mucking about
|
|
Menedas
(Themenstarter)
Anmeldungsdatum: Sept. 1, 2005
Beiträge: 1032
|

27. Mai 2012 18:36
Ich mach das gerade in nem Cygwin. Ungut, dass das einen Unterschied macht.
|
|
track
Anmeldungsdatum: Juni 26, 2008
Beiträge: 4729
Wohnort: Wolfen (S-A)
|

27. Mai 2012 19:00
Ein wichtiger Punkt ist dabei, dass das [A-Z] nicht immer [ABC...XYZ] bedeutet (je nach Locale), sondern vielleicht [AäÄbBcC...xXyYzZ] oder so. Eine sichere Alternative dagegen ist die Nutzung von Zeichenklassen: sed -r "s/^([[:upper:]]*\s)*//" test Das //g ist übrigens auch Quatsch. Ein Muster, das am Zeilenanfang verankert ist, kann sowieso nicht mehrfach vorkommen. LG, track
|
|
Menedas
(Themenstarter)
Anmeldungsdatum: Sept. 1, 2005
Beiträge: 1032
|

27. Mai 2012 20:23
Ha, ziemlich cool. Und ich verstehs sogar  Vielen lieben Dank
|
|
Vain
Anmeldungsdatum: April 12, 2008
Beiträge: 2233
|

27. Mai 2012 20:55
Menedas schrieb: Ha, ziemlich cool. Und ich verstehs sogar  Vielen lieben Dank
tracks Variante funktioniert jetzt auf Cygwin? Oder liegt es daran, dass
er keinen Quantifier „{2,}“ angegeben hat? Weil seine Version löscht
dir auch ein „I“ am Satzanfang, wie es im Englischen ja durchaus
vorkommen kann: „I am a penguin.“ (Ich würde auch mal probieren, wie die Sache aussieht, wenn du Single
Quotes statt Double Quotes verwendest. Und wenn’s dann auch noch nicht
geht, ist vielleicht die Ausgabe von „echo 'foo{2,}bar'“
aufschlussreich.)
|
|
Menedas
(Themenstarter)
Anmeldungsdatum: Sept. 1, 2005
Beiträge: 1032
|

27. Mai 2012 21:02
Ja, es funktioniert jetzt in Cygwin durch das upper]. Und ja, hast recht, das I würde ohne Quantifier verloren gehen, hatte ich nicht aufgepasst. Hab es jetzt hinzugefügt und funktioniert so sed -r "s/^([[:upper:]]{2,}*\s)*//" testUnd
echo 'foo{2,}bar'liefert: foo{2,}bar Beides macht keinen Unterschied bzw. funktioniert nicht: sed -r 's/^([A-Z]{2,}*\s)*//' test
sed -r "s/^([A-Z]{2,}*\s)*//" testDas kommt da beide Male raus: 90
00:05:44,040 --> 00:05:46,160
all right, mate?
91
00:05:49,080 --> 00:05:51,840
on, stop mucking about.
|
|
track
Anmeldungsdatum: Juni 26, 2008
Beiträge: 4729
Wohnort: Wolfen (S-A)
|

27. Mai 2012 21:39
Menedas schrieb: sed -r "s/^([[:upper:]]{2,}*\s)*//" test
Äh, der Stern muss dann aber weg ! (denn {2,} ist ja schon der Quantifizierer) Mit den Ein-Zeichen- Worten ist das allerdings so eine Sache: track@lucid:~$ echo 'SHE LAUGHS Come on, stop mucking about' | sed -r "s/^([[:upper:]]{2,}\s)*//"
Come on, stop mucking about
track@lucid:~$ echo 'I LAUGH Come on, stop mucking about' | sed -r "s/^([[:upper:]]{2,}\s)*//"
I LAUGH Come on, stop mucking aboutweil dann eventuell auch mal eine Deaf Info nicht erkannt wird. (-> dann wäre die Testbedingung entsprechend der tatsächlichen Deaf Texte zu verfeinern) track
|
|
Menedas
(Themenstarter)
Anmeldungsdatum: Sept. 1, 2005
Beiträge: 1032
|

27. Mai 2012 21:52
Hm. Also müsste man prüfen, ob danach noch ein komplett groß geschriebenes Wort bzw. zwei große Buchstaben kommen. Aber ich glaube, das lässt sich nicht sicher filtern. So wie es jetzt ist, ist es für mich ok. Denn ein "I" wird es im Deaf Info eher nicht geben. Weil die ja immer in der dritten Person sind. Sag ich jetzt mal. Außerdem ist ein so schlecht eingebautes Deaf Info zum Glück eher die Ausnahme. Und hast recht, der Stern muss natürlich weg. Ich muss mehr mitdenken 
|
|
Menedas
(Themenstarter)
Anmeldungsdatum: Sept. 1, 2005
Beiträge: 1032
|

29. Mai 2012 18:54
Mal ne Frage. Ich habe ja auch sowas hier: WOMAN'S VOICE: He was so angry.
Woman's Voice: He was so angry. Filtern tue ich das im Moment so:
sed 's/^[A-Za-z ''']*: //' Ist das ok, oder gibts da womöglich Probleme?
|
|
track
Anmeldungsdatum: Juni 26, 2008
Beiträge: 4729
Wohnort: Wolfen (S-A)
|

29. Mai 2012 19:03
Probleme scheint es schon zu geben. (Hast Du es denn mal ausprobiert ?? - Dein Filter geht bei mir nämlich nicht, ihm fehlt zumindest ein ' ) Beim "quoten" ginge es in diesem Fall einfacher, wenn Du "doppelte" statt 'einfache' Gänsefüßchen nähmst. (denn die 'einfachen' sind nicht schachtelbar !) Aber, da Du ohnehin anscheinend "alles bis zum ersten Doppelpunkt und Leerzeichen" weghauen willst, ginge das auch einfacher mit sed 's/^[^:]*: //' LG, track
|
|
Menedas
(Themenstarter)
Anmeldungsdatum: Sept. 1, 2005
Beiträge: 1032
|

29. Mai 2012 19:25
Achje, ich hab nicht kontrolliert wie das hier gepostet wird. Die zwei Beispiele waren so gemeint:
WOMAN'S VOICE: He was so angry.
Woman's Voice: He was so angry. Und filtern tue ich das im Moment so:
sed 's/^[A-Za-z '\'']*: //' Jetzt müsste auch klar sein, warum ich da drei ' habe  Und irgendwie hatte ich fast vermutet, dass es noch so ein coole Lösung wie die deine gibt Aber ich bin nur mal wieder nicht drauf gekommen :/ Allerdings versteh ich sie auch noch nicht wirklich. Trotzdem schon mal danke 
|
|
Vain
Anmeldungsdatum: April 12, 2008
Beiträge: 2233
|

29. Mai 2012 19:49
– edit: Och nö, oder? Dein „Woman's Voice“ in den beiden
Schreibweisen ist auch eine Deaf Info, die einfach raus soll oder was?
Da hab’ ich ja voll das Thema verfehlt. Naja, egal, ich hatte meinen
Spaß am Gerät.
Dein Beispiel-sed löscht aber einfach alles vor und inklusive dem
Doppelpunkt. Das hat track zusammengefasst (sein Ausdruck heißt: „Am
Anfang der Zeile irgendwas, das kein Doppelpunkt ist, dann ein
Doppelpunkt und dann ein Leerzeichen.“).
Ich weiß nicht, ob das mit sed besonders schön lösbar ist, was du da
jetzt vorhast. Das beste, was ich noch anbieten könnte, wäre das hier: #!/bin/sed -f
# Erster Schritt: Die Zeile so aufteilen, dass das Zeug vor und nach dem
# Doppelpunkt getrennt zugreifbar ist -- der eine Teil im Hold-Space,
# der andere im Pattern-Space.
# Sichere die aktuelle Zeile im Hold-Space.
h
# Lösche am Anfang der Zeile alles bis zum ersten Doppelpunkt.
s/^.*: //
# Tausche nun Hold- und Pattern-Space aus.
x
# Lösche jetzt alles nach dem Doppelpunkt.
s/:.*$//
# Was jetzt im Pattern-Space steht, ist der Teil vor dem Doppelpunkt.
# Darin wird jetzt nach Worten gesucht (mehrere Zeichen, die kein
# Leerzeichen sind, dann ein Leerzeichen oder das Zeilenende -- das ist
# ein Wort). Die Ersetzung verwendet \L und \E: Alles zwischen \L und \E
# wird zu Lower-Case verwandelt. Das kleine \u sorgt dafür, dass der
# erste Buchstabe aber wird Upper-Case wird. Und das & ist der gesamte
# Match, also ein Wort.
s/[^ ]\+\( \|$\)/\L\u&\E/g
# Zweiter Schritt: Die beiden Spaces wieder zusammenbasteln.
# Tausche wieder aus.
x
# Füge jetzt den aktuellen Pattern-Space (darin steht der Teil nach dem
# Doppelpunkt) an den Hold-Space an. Und dann holst du den Hold-Space
# wieder zurück in den Pattern-Space.
H
x
# Durch das Ankleben steht da jetzt mitten in der "Zeile" des
# Pattern-Spaces ein Newline. Da wollen wir wieder unseren Doppelpunkt
# und das Leerzeichen haben.
s/\n/: / (Als Datei speichern, ausführbar machen und dann mit „./bla.sed
deineDaten.txt“ aufrufen.) Das erzeugt bei meinen Tests die gewünschte Ausgabe. Schön ist aber was
anderes. Und bei solcher Komplexität würde ich auch nicht mehr sed
verwenden. Zur Klarstellung: „Gewünschte“ Ausgabe ist in dem Fall das folgende:
$ cat data
WOMAN'S VOICE: He was so angry.
$ ./bla.sed data
Woman's Voice: He was so angry.
|