Se eu entendi a pergunta corretamente,
é sobre como fazer o mesmo comando ( grep
),
com as mesmas opções e a mesma entrada,
mas várias vezes,
com diferentes argumentos de regex e diferentes saídas.
E eu acho que você quer evitar repetições / duplicações desnecessárias.
Parece que você deseja uma matriz de expressões regulares (strings de pesquisa):
declare -A regex
regex[1]="line1\|here1"
regex[2]="line2\|here2"
regex[3]="line3\|here3"
regex[4]="line4\|here4"
for i in "${!regex[@]}"
do
grep -h -r --color=always "${regex["$i"]}" file.txt >> "pattern$i.txt"
done
A primeira linha ( declare -A regex
) declara uma matriz associativa
chamado regex
; isso significa que ele cria a matriz como um espaço reservado,
mas não insere nenhuma informação (elementos) nela.
As próximas quatro linhas preenchem a matriz com quatro elementos,
quais são as expressões regulares,
indexados pelos números 1
, 2
, 3
e 4
.
(Eu estou usando esses índices porque é isso que você parece querer,
mas você pode usar quaisquer strings distintas como índices:
por exemplo, uno
, dos
, tres
e cuatro
,
ou ant
, bat
, cat
e dog
. † )
A instrução for
, for i in "${!regex[@]}"
,
faz com que a variável i
faça uma iteração
os valores de índice 1
, 2
, 3
e 4
.
(Se eu tivesse deixado de fora o !
e disse for i in "${regex[@]}"
,
teria iterado através dos valores dos elementos,
line1\|here1
, line2\|here2
, line3\|here3
e line4\|here4
.)
Quando $i
é 1
, ${regex["$i"]}
reduz a ${regex[1]}
,
que se expande para line1\|here1
.
Então, o loop itera (executa) quatro vezes,
executando os quatro comandos grep
que você deseja.
Se você deseja executar os processos grep
em paralelo, faça:
for i in "${!regex[@]}" do grep -h -r --color=always "${regex["$i"]}" file.txt >> "pattern$i.txt" & done wait