grep 결과를 배열에 저장

grep 결과를 배열에 저장

bash 배열의 패턴과 일치하는 모든 파일 이름을 저장하고 싶습니다.

내 솔루션이 작동하지 않습니다. 파이프 사용으로 인해 문제가 발생한 것 같은데 어떻게 해결해야 할지 모르겠습니다.

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

답변1

bash-4.4위와 같이 사용하면 다음과 같습니다.

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

이전 bash버전의 경우:

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

또는 ( bashzsh 스타일 arr+=()구문이 없는 이전 버전과의 호환성을 위해):

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

귀하의 접근 방식에는 몇 가지 문제가 있습니다.

  • -o를 사용하면 grep전체 레코드가 아닌 패턴과 일치하는 레코드 부분만 인쇄됩니다. 당신은 여기서 그것을 원하지 않습니다.
  • find줄 바꿈은 파일 경로의 모든 문자만큼 유효하므로 줄 바꿈으로 구분된 기본 출력은 사후 처리될 수 없습니다. NUL로 구분된 출력이 필요합니다. 따라서 NUL로 구분된 레코드를 처리하려면 -print0in find-zin이 필요합니다.grep
  • IFS=에 전달하는 것도 잊어버렸습니다 read.
  • 에서는 bash이 옵션이 없으면 파이프라인의 마지막 부분이 서브셸에서 실행되므로 해당 서브셸 lastpipe만 업데이트하면 됩니다 .$arr

관련 정보