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