Daten (RS232 Text-Stream) anhand dreier Zeilenenden filtern

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
atomical
Beiträge: 118
Registriert: 13.04.2005 22:48:41
Wohnort: Wilsdruff

Daten (RS232 Text-Stream) anhand dreier Zeilenenden filtern

Beitrag von atomical » 16.11.2005 21:10:24

Hallo

Ein Bash-Problem:

Ich schreibe Daten von der RS232 Schnittstelle mit - auf das sendende Gerät habe ich keinen Einfluss. Leider wird kein explizites Zeichen gesendet, um die Datensätze voneinander zu trennen, sondern eine Zeichenfolge

Code: Alles auswählen

\n \n \n
(LF - SPACE - LF - SPACE - LF) - wobei \n entsprechend für LF steht. Ich müsste also mindestens auf zwei Leerzeichen gefolgt von einem LF filtern können - und mit grep krieg ich das nicht hin.

Any Hints?
mfg, atomical

Benutzeravatar
Six
Beiträge: 8066
Registriert: 21.12.2001 13:39:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Siegburg

Beitrag von Six » 17.11.2005 03:46:04

Vielleicht verstehe ich dich nur falsch, aber du kannst grep auch Zeichenketten in Anführungszeichen übergeben und da können dann beliebig viele Frei- und Steuerzeichen drin sein.

Benutzeravatar
atomical
Beiträge: 118
Registriert: 13.04.2005 22:48:41
Wohnort: Wilsdruff

Beitrag von atomical » 17.11.2005 07:03:12

Leider scheinen LF Zeichen Probleme zu machen - mal in hex

Code: Alles auswählen

0A 20 0A 20 0A
- und danach will ich filtern.

Wenn ich grep zählen lasse, kommt das raus:

Code: Alles auswählen

[ alex@phoenix] ~/work/fuba (75G free)% grep -c -n ' ' beispiel.txt
16
[ alex@phoenix] ~/work/fuba (75G free)% grep -c -n '\n' beispiel.txt
2
[ alex@phoenix] ~/work/fuba (75G free)% grep -c -n '\n ' beispiel.txt
1
[ alex@phoenix] ~/work/fuba (75G free)% grep -c -n ' \n' beispiel.txt
0
[ alex@phoenix] ~/work/fuba (75G free)% grep -c -n '\n \n' beispiel.txt
0
Offenbar werden einzig die Leerzeichen (über die komplette Datei) richtig gezählt ...

http://www.htw-dresden.de/~s50369/beispiel.txt - die betreffende Stelle liegt am Ende der Datei - zwischen der Reihe "=" und dem "abc" - nach den "=" kann ich nicht filtern, das wär nicht eindeutig.
mfg, atomical

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

Beitrag von godsmacker » 17.11.2005 10:06:26

Nimm mal double-quotes (") anstatt der einfachen (').

-Flo

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

Beitrag von Joghurt » 17.11.2005 11:38:18

godsmacker hat geschrieben:Nimm mal double-quotes (") anstatt der einfachen (')
Was soll das bringen? grep arbeitet auch nur Zeilenweise, IIRC

@atomical: was willst du denn genau machen? Einzelne Datensätze abspeichern?

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

Beitrag von godsmacker » 17.11.2005 11:57:10

Joghurt hat geschrieben:
godsmacker hat geschrieben:Nimm mal double-quotes (") anstatt der einfachen (')
Was soll das bringen? grep arbeitet auch nur Zeilenweise, IIRC
Diverse shells interpolieren escape Sequenzen nicht in single quotes.

Benutzeravatar
atomical
Beiträge: 118
Registriert: 13.04.2005 22:48:41
Wohnort: Wilsdruff

Beitrag von atomical » 17.11.2005 19:02:05

godsmacker hat geschrieben:Nimm mal double-quotes (") anstatt der einfachen (').

-Flo
Geht leider auch nicht ...

Code: Alles auswählen

[ alex@phoenix] ~/work/fuba (75G free)% grep -c -n " \n" beispiel.txt
0
Joghurt hat geschrieben:@atomical: was willst du denn genau machen? Einzelne Datensätze abspeichern?
Ich lese von der seriellen Schnitstelle unterschiedlich große Datensätze - die einzig klare Trennung besteht aus der Kombination von LF und SPACE Zeichen.

Ich habe mittlerweile 2 Wege - einen aus dem IRC von hp_tux:

Code: Alles auswählen

cat beispiel.txt | tr '\n' 'ö'|sed 's#ö ö ö#Ö#'|tr ö '\n'
trickreich - erst alle LF gegen ö ersetzen, dann die Kombination "ö ö ö" gegen Ö und alle übrigen ö's wieder gegen \n - setzt voraus, das ich zwei Zeichen habe (hier ö und Ö), die nicht im Stream vorkommen.

Die zweite ist ein Perl-Script http://www.mrunix.de/forums/showthread.php?p=189655

Danke an alle, die helfen wollten :)
mfg, atomical

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

Beitrag von Joghurt » 17.11.2005 19:41:37

atomical hat geschrieben:

Code: Alles auswählen

cat beispiel.txt | tr '\n' 'ö'|sed 's#ö ö ö#Ö#'|tr ö '\n'
Da fehlt doch das g am Ende des substitute Befehls, ansonsten wird nur das erste Vorkommen gefunden:

Code: Alles auswählen

 tr '\n' 'ö' < beispiel.txt | sed 's#ö ö ö#Ö#g' | tr ö '\n'

Antworten