Eu não conheço essa ferramenta. Eu vim com o seguinte script. Ajuste-o às suas necessidades:
#!/bin/bash
sprtr='%separator'
cmmnd='wc -l'
set -o pipefail
while ! sed -n "/^${sprtr}$/q1;p" | $cmmnd ; do
:
done
É assim:
-
sedlê destdinaté encontrar um determinado separador ou EOF e, em seguida, sai. - O comando escolhido recebe o fragmento apropriado de
sed. - A menos que
$cmmndfalhe,set -o pipefail,!eq1colabore, portanto, quando$sprtrfor encontrado, o canal inteiro retornará o status de saída0. Isso executa o código (vazio) entredoedonee, em seguida, faz um loop, entãosedé executado novamente para servir o próximo fragmento. - Se
$cmmndfalhar ou se$sprtrnão for encontrado (EOF alcançado), todo o canal retornará status de saída diferente de zero. Isso faz com que o script deixe o loopwhile.
Algumas armadilhas:
- Você não pode usar nenhum separador literalmente e sem pensar. Alguns valores de
$sprtrirão quebrar o comandosedou alterar seu comportamento se você não escapar de caracteres especiais à sua sintaxe. Exemplos:/,/q; /. -
set -o pipefailfunciona no Bash 3 e acima, eu acho. A alternativa (mas não equivalente) émispipedemoreutils. - Seu
sedprecisa entenderq1(isso saisedcom o código de saída1).
Eu admito que não há muita elegância nesta solução.