Daten (RS232 Text-Stream) anhand dreier Zeilenenden filtern

atomical

atomical

castor transporteur
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:
\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?
 
atomical schrieb:
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:
\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.
 
Zuletzt bearbeitet:
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:
Code:
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
 
Hallo
Ja mit perl geht das latürnich einfacher, wie ich schon sagte.
Kurz ungetestet:
Code:
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
 
Hallo
Als Ergänzung: - sehe gerade , dass du das ja in Dateien splitten willst-

Code:
|
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
 

Ähnliche Themen

Stream auf nicht druckbare Zeichen filtern

Zurück
Oben