Você pode usar o comando read
( bash
builtin) para forçar os caracteres a serem lidos um por um:
netcat localhost 9090 | (
cnt=0
line=
while read -N 1 c; do
line="$line$c"
if [ "$c" = "{" ]; then
cnt=$((cnt+1))
elif [ "$c" = "}" ]; then
cnt=$((cnt-1))
if [ $cnt -eq 0 ]; then
printf "%s\n" "$line"
line=
fi
fi
done
) | grep sender
Esse script deve imprimir cada saída completa com o equilíbrio entre {
e }
, mas você pode alterar o script para fazer o que quiser. Este roteiro NÃO faria bem em um benchmark comparado a praticamente qualquer coisa, mas é bem simples e parece funcionar para mim ...
Observe que o seu exemplar de teste não tem correspondência entre {
e }
, portanto, se esse for o caso da entrada real, convém alterar os critérios para imprimir a linha.