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:
-
sed
lê destdin
até encontrar um determinado separador ou EOF e, em seguida, sai. - O comando escolhido recebe o fragmento apropriado de
sed
. - A menos que
$cmmnd
falhe,set -o pipefail
,!
eq1
colabore, portanto, quando$sprtr
for encontrado, o canal inteiro retornará o status de saída0
. Isso executa o código (vazio) entredo
edone
e, em seguida, faz um loop, entãosed
é executado novamente para servir o próximo fragmento. - Se
$cmmnd
falhar ou se$sprtr
nã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
$sprtr
irão quebrar o comandosed
ou alterar seu comportamento se você não escapar de caracteres especiais à sua sintaxe. Exemplos:/
,/q; /
. -
set -o pipefail
funciona no Bash 3 e acima, eu acho. A alternativa (mas não equivalente) émispipe
demoreutils
. - Seu
sed
precisa entenderq1
(isso saised
com o código de saída1
).
Eu admito que não há muita elegância nesta solução.