Você pode traduzir (ou transliterar) os caracteres #
para novas linhas com
tr '#' '\n'
então
./grabserial -d "/dev/ttyUSB4" -b 9600 | tr '#' '\n'
deve dar a você
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
︙
em tempo real.
Se você
… sed 's/$/#\r/'
(usando o fato de que sed
(e expressões regulares em geral)
use $
para representar o final de uma linha.
Gotcha
Você pode ter um problema
que tr
buffers sua saída quando essa saída está indo para um pipe ou um arquivo.
Talvez a melhor maneira de lidar com isso seja seguir o conselho do αғsнιη
para desativar o buffer com stdbuf
; por exemplo,
./grabserial -d "/dev/ttyUSB4" -b 9600 | stdbuf -oL tr '#' '\n' | sed 's/$/#\r/' > RFIDs.txt
Caso não esteja claro,
a opção para stdbuf
é minúscula o
(oh) e maiúscula L
(ell),
que diz que a saída padrão deve ser armazenada em buffer.
Linha de fundo (TL; DR) # 1:
Então você deve poder usar
./grabserial -d "/dev/ttyUSB4" -b 9600 | stdbuf -oL tr '#' '\n' > RFIDs.txt
para obter as entradas sem o #
no final ou
./grabserial -d "/dev/ttyUSB4" -b 9600 | stdbuf -oL tr '#' '\n' | sed 's/$/#/' > RFIDs.txt
para obter as entradas com o #
no final, mas sem o \r
ou
./grabserial -d "/dev/ttyUSB4" -b 9600 | stdbuf -oL tr '#' '\n' | sed 's/$/#\r/' > RFIDs.txt
para obter as entradas com o #
e o \r
no final.
Linha de fundo (TL; DR) # 2:
Você não disse como está terminando o comando. Se você estiver digitando Ctrl + C , que pode estar causando um problema 1 . Se sim, tente:
- colocando uma das linhas de comando acima no plano de fundo com
&
, e então - quando estiver pronto para sair
faça um
ps
e obtenha o PID do processograbserial
e - mate-o com o comando
kill
.
Linha de fundo (TL; DR) # 3:
Você diz que precisa ler os dados em tempo real, sem entrar em detalhes. Se você tem algum programa / script que é capaz de ler a partir de stdin, tente
./grabserial -d "/dev/ttyUSB4" -b 9600 | stdbuf -oL tr '#' '\n' | sed 's/$/#\r/' | tee RFIDs.txt | your_program
Isso deve gravar os dados no arquivo de saída enquanto, ao mesmo tempo, o canaliza para o seu programa.
Linha de fundo (TL; DR) # 4:
Se, de fato, cat
funcionar tão bem quanto grabserial
, você não precisará de nenhum deles.
coisas como
stdbuf -oL tr '#' '\n' < /dev/ttyUSB4 | sed 's/$/#\r/' > RFIDs.txt
deve funcionar tão bem.