Você pode ler uma única linha de entrada com sed
e converter o delimitador em novas linhas como:
% sed 'y/,/\n/;q' /dev/tty
> this,is,a,single,line
##OUTPUT
this
is
a
single
line
Como sed
grava o resultado como stdout como um arquivo de texto, seguir isso com e x
plicit grep
é fácil e ocorre em um único fluxo. E, de fato, você pode usar sed
como um smart tee
se usar seu w
rite na função de arquivo; e, se você w
rite para arquivar os dispositivos do descritor, poderá dividir sua saída com base nas regras definidas.
Uma função que solicita a entrada e a saída apenas de uma lista delimitada por nova linha de argumentos aceitáveis para saída stdout e errônea para stderr pode ser semelhante a:
_accept_prompt() (
. /dev/fd/0
IFS=${delim-,}
_prompt "$@" >&2
{ _read_split "$@" |
err=all _grep_ok "$@" |
sed '1{$d}' >&2
} 3>&1 | _grep_ok "$@"
) <<\HELPERS
_prompt() {
cat ; printf ' : '
} <<-PROMPT
Choose from : $(printf "'%s' " "$@")
Enter a '$IFS'-delimited selection below...
PROMPT
_read_split() {
y="y/${IFS}/\n/"
sed -ne "H;x;s/^/Invalid input IGNORED:/;${y};p;x" \
-ne "/all/s/.*/$*/;${y};w /dev/fd/3" -ne q
} </dev/tty
_grep_ok() {
grep -${err+v}xF "$(printf '%s\n' "$@" $err)"
}
HELPERS
Eu divido isso em esperançosamente funções auxiliares mais descritivamente nomeadas no lugar dos comentários e as colei na função principal. Então o fluxo acontece nas primeiras linhas. Eu esperava deixar isso mais claro.
_read_split
gera dois fluxos - >&1
e >&3
. _grep_ok
pega o primeiro com $err
definido e grava em >&2
todas as linhas contidas em sua entrada que não estão entre os parâmetros posicionais de _accept_prompt
.
_grep_ok
também concorrentemente seleciona o segundo fluxo - >&3
e grava em suas linhas >&1 stdout
all em sua entrada que estão entre _accept_prompt
' s parâmetros posicionais.
Executando:
% _accept_prompt this is the list of acceptable parameters
###PROMPT
Choose from : 'this' 'is' 'the' 'list' 'of' 'acceptable' 'parameters'
Enter a ','-delimited selection below...
###INPUT
: all,invalid
###STDOUT
this
is
the
list
of
acceptable
parameters
###STDERR
Invalid input IGNORED:
invalid
Você pode alterar o delimitador de vírgula ,
padrão na invocação como:
delim=? _accept_prompt $args