Verifique a entrada canalizada nos espaços vazios e encaminhe-a

3

Eu quero canalizar a saída de um comando para outro script. Neste outro script eu quero verificar se a entrada estava vazia ou apenas consiste em espaços. Se este for o caso, vou ignorá-lo. Caso contrário, quero que toda a entrada seja encaminhada para outros comandos.

Para mais clareza, vou executar algo como cat input.txt | ./script.sh , em que input.txt se parece com

line 1
line 2
line 3

e script.sh atualmente se parecem com:

read input_text

if [ -z "$input_text" ]
    # ignore emtpy input
    then exit 0
else
    # do something here with the input
fi

O problema é que, nesse cenário, a primeira linha da entrada "linha 1" é lida na variável input_text e, portanto, não é encaminhada com o restante da entrada (que consiste apenas nas linhas 2 e 3) no código seguinte após else .

So , como posso primeiro verificar se a entrada consiste em mais do que apenas espaços vazios e, em seguida, encaminhar toda a entrada para outro comando?

    
por Matthias 27.11.2015 / 13:13

3 respostas

2

Isso significa que você deseja encaminhar a entrada assim que vir um caractere não em branco.

awk -v cmd='otherCommand' '
  forward {print | cmd; next}
  {initial_output = initial_output $0 "\n"}
  NF {printf "%s", initial_output | cmd; forward = 1}'

Exemplo:

$ printf '%b\n' ' ' '' '\t' | awk -v cmd='echo START; sed "s/.*/<&>/"' '
  forward {print | cmd; next}
  {initial_output = initial_output $0 "\n"}
  NF {printf "%s", initial_output | cmd; forward = 1}'
$ printf '%b\n' ' ' '' '\t' something | awk -v cmd='echo START; sed "s/.*/<&>/"' '
  forward {print | cmd; next}
  {initial_output = initial_output $0 "\n"}
  NF {printf "%s", initial_output | cmd; forward = 1}'
START
< >
<>
<       >
<something>
    
por 27.11.2015 / 13:43
0
#!/bin/sh
{   tee /dev/fd/3 <&4&:|
    grep -q '[^[:space:]]' &&
    cat - /dev/fd/4 <&3
}   3<<"" 4<&0 | another_few_commands

# cause i dont know how else to end this with a blank line
    
por 27.11.2015 / 13:39
-1

que tal usar um loop? (isso terminará em linhas vazias ou somente espaços)

#!/bin/sh
while read input_text; do
  [ -z "$input_text" ] && break
  # do something with the non-blank input
done
exit 0
    
por 27.11.2015 / 13:20