Salve grep result to array

1

Eu quero salvar todos os nomes de arquivos que correspondem ao padrão no array bash.

Minha solução não funciona. Eu acho que o problema é por causa do uso do pipe, mas eu não sei como consertar isso.

i=0
find . -type f | grep -oP "some pattern" | while read -r line; do
    arr[$i]=$line;
    let i=i+1;
done
    
por user23316192 01.05.2017 / 16:58

1 resposta

3

Com bash-4.4 e acima, você usaria:

readarray -d '' -t arr < <(
  find . -type f -print0 | grep -zP 'some pattern')

Com versões anteriores de bash :

arr=()
while IFS= read -rd '' file; do
  arr+=("$file")
done < <(find . -type f -print0 | grep -zP 'some pattern')

Ou (para ser compatível com versões antigas de bash que não tivessem a sintaxe arr+=() do estilo zsh):

arr=() i=0
while IFS= read -rd '' file; do
  arr[i++]=$line
done < <(find . -type f | grep -zP 'some pattern')

Sua abordagem tem vários problemas:

  • com -o , grep apenas imprime as partes dos registros que correspondem ao padrão em oposição ao registro completo. Você não quer isso aqui.
  • A saída delimitada por nova linha padrão de find não pode ser pós-processada, pois o caractere de nova linha é tão válido quanto qualquer outro em um caminho de arquivo. Você precisa de uma saída delimitada por NUL (portanto -print0 in find e -z in grep para processar registros delimitados por NUL).
  • você também esqueceu de passar IFS= para read .
  • em bash e sem a opção lastpipe , a última parte de uma linha de tubulação é executada em um subshell, portanto, você só atualizaria o $arr dessa sub-sela.
por 01.05.2017 / 17:12