PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Daten (RS232 Text-Stream) anhand dreier Zeilenenden filtern



atomical
16.11.2005, 21:09
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
\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?

Wolfgang
17.11.2005, 09:15
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
\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?
Hallo
Folgendes matcht auf alle Zeilen, die nur zwei space = Leer enthalten.
grep -e '^[[:space:]]\{2\}$'


Wenn in deinem System egrep -> ( ein Script welches grep mit der Option -E startet) <- existiert, kannst du auch
egrep
statt
grep -e
verwenden.

Gruß Wolfgang
EDIT:
Ich sehe gerade, dass du wahrscheinlich auf nur ein space matchen müsstest.
(hier mal mit egrep)
egrep '^[[:space:]]\{1\}$'
Multiline geht allerdings mit grep nicht so recht.
Da muss dann perl ran.

atomical
17.11.2005, 19:03
Leider gibt es noch mehr Zeilen, die mehrere Leerzeichen enthalten - das wär nicht eindeutig - und multiline kann grep nicht ...

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

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

Wolfgang
17.11.2005, 20:49
Hallo
Ja mit perl geht das latürnich einfacher, wie ich schon sagte.
Kurz ungetestet:


echo -e "Achtung Trennzeichen:\n \n \ndrei leerzeilen"|perl -ne 'BEGIN{$/="\n \n \n"}print $_ if (/^\s{2}\n\s{2}\n$/mg)'

;)
Gruß Wolfgang

Wolfgang
17.11.2005, 21:26
Hallo
Als Ergänzung: - sehe gerade , dass du das ja in Dateien splitten willst-


|
perl -pe 'BEGIN {$/="\n \n \n"; $i=0 } open STDOUT, ">$ARGV.$i" && $i++ if (/^\s{2}\n\s{2}\n$/mg)' "dein inputstream als Datei oder FIFO oder what ever"


Geht doch nix über perl gelle ;)

Gruß Wolfgang