grep
é definido para combinar e reter ou descartar as linhas, portanto, ele precisa ler a linha inteira antes de fazer a correspondência; que não consegue realizar o que você quer.
Primeiro, você precisa verificar se command
faz esse eco de caracteres de entrada um por um para um canal. Programas padrão C (e às vezes outros programas usando C stdio) por padrão usam buffer de linha quando stdout é um 'dispositivo interativo' como definido pela implementação, mas o buffer total de outra forma, e pipe geralmente não é definido como interativo. Seu command
já está se comportando de forma incomum em um tty, mas verifique se ele ainda faz isso em um canal com command | dd bs=1
.
Se isso não funcionar, você precisará de um programa que configure uma pseudo-tty (pty) para command
, como o script
sugerido por Mark Plotnick.
Se o eco no pipe funcionar no lado command
, tudo o que você precisa é algo do lado direito do tubo que não espere por uma linha completa. Um programa C simples pode fazer isso, algo como:
#include <stdio.h>
int main (void) {
setvbuf (stdout, NULL, _IONBF, 0);
int c;
while( (c = getchar()) != EOF ){
int sel = c != '%';
for( ; c != '\n' && c != EOF; c = getchar() )
if( sel ) putchar (c);
if( sel ) putchar ('\n');
}
}
Ou se você tiver bash
- que os dispositivos incorporados IMLE tendem a NÃO - tente um script que contenha
IFS=$'\n'
while read -rn1 c; do y=true; [[ "$c" == "%" ]] && y=false;
while ! [[ "$c" == "" ]]; do $y && printf "%c" "$c"; read -rn1 c || exit; done
$y && printf "\n"; done