Você pode fazer isso em Perl:
$ perl -lne 'if(/A=([^\s]+)/){print "A : $1"; 'scriptA.sh'}
if(/B=([^\s]+)/){print "B : $1"; 'scriptB.sh'}' Data.txt
Explicação
-
-lne
: remova as novas linhas à direita de cada linha de entrada e adicione uma nova linha a cada chamada deprint
(-l
); leia o arquivo linha por linha (-n
) e execute o script fornecido por-e
em cada linha. -
if(/A=([^\s]+)/){print "A : $1"; 'scriptA.sh'}
: se essa linha corresponder aA=
something, imprimaA : something
(os parênteses significam que o padrão é capturado e agora é salvo como$1
) e, em seguida, executescriptA
. -
if(/B=([^\s]+)/){print "B : $1"; 'scriptB.sh'}
: como acima, mas para B.
Ou você pode simplesmente extrair os valores e analisá-los:
$ grep -Po '[AB]=[^\s]+' Data.txt |
while IFS="=" read name val; do
echo "$name=$val";
[ "$name" = "A" ] && scriptA.sh || scriptB.sh;
done
Explicação
-
grep -Po '[AB]=[^\s]+' Data.txt
: o-P
ativa PCREs , e o-o
fará com quegrep
imprima cada correspondência uma linha diferente. O[AB]=[^\s]+
significa "corresponder A ou B e, em seguida,=
, em seguida, quantos caracteres não-whitespace forem possíveis. A saída disso é a coleção completa deA=foo
eB=bar
de seu arquivo de entrada, cada um em seu própria linha. -
while IFS="=" read name val
: defina o separador de campo ionput como=
e leia duas variáveis. Isso significa que$name
seráA
ouB
e$value
será o valor associado a eles. -
echo "$name=$val";
: imprima-os, altere o formato para o que quiser. -
[ "$name" = "A" ] && scriptA.sh || scriptB.sh;
: se$name
forA
, executescriptA.sh
, caso contrário, executescriptB.sh
. Ambas as soluções acima assumem que os scripts que você deseja chamar sãoscriptA.sh
escriptB.sh
e que estão em seu $ PATH. Edite de acordo.