확장할 변수가 포함된 패턴과 함께 grep을 사용하세요.

확장할 변수가 포함된 패턴과 함께 grep을 사용하세요.

테이블 파일이 있습니다

2e95d7582c53583fa8afb54e0fe7a2597c92cbba 1461065389 52880 temp/hello/file.txt
46c897a7aa8a641f46080b3431860bd0cd4a8f05 1461066221 207 temp/Another file.txt
83c8ce6b163ec1c615617fa0dbde9e928bc3daf4 1461056193 86112 Pictures/a photo.jpg
...

즉, 각 줄에는 40자의 16진수 숫자가 있고 그 뒤에 공백, 정수, 공백, 정수, 공백 및 공백을 포함할 수 있는 파일 경로가 옵니다. 모든 도로는 독특합니다.

Bash 스크립트에서 내 변수는 첫 번째 16진수 문자열과 공백(처음 41자)만 제외하고 파일의 줄과 동일한 형식을 갖습니다. 예를 들면 다음과 같습니다.

myvar="1461066221 207 temp/Another file.txt"

나의 목표는 찾는 것이다.이것파일의 일치하는 줄myvar 정확히처음 41자는 무시됩니다. 그러한 일치 항목이 발견되면 변수가 line파일의 전체 줄로 설정되기를 원합니다 . 위의 예에서는 line다음과 같이 설정됩니다.

46c897a7aa8a641f46080b3431860bd0cd4a8f05 1461066221 207 temp/Another file.txt

일치하는 항목이 없으면 line빈 문자열로 설정하거나 전혀 설정하지 않아야 합니다.

내 솔루션은 다음과 같습니다( filelist파일 이름).

line=$(grep --color=never -E "^.{41}$myvar$" $filelist)

한 가지 문제는 확장 시 특별한 의미를 갖는 , , Even 등과 $myvar같은 특수 기호가 포함될 수 있다는 것입니다 . 나는 공연하고 싶다.+^$grepgrep정밀한myvar한 줄의 처음 41자를 제외한 모든 문자 와 일치합니다 .

답변1

Perl이 구출하러 옵니다!

perl -ne 'BEGIN { $search = shift }
          print if /^.{41}\Q$search\E$/;
         ' -- "$myvar" "$filelist"
  • -n파일을 한 줄씩 읽습니다.
  • BEGIN 블록은 Perl 변수 $search의 첫 번째 인수에서 $myvar를 검색합니다.
  • \Q...\E내부 부품 인용(참조참조 요소). 이는 변수에 포함될 수 있는 모든 특수 문자를 처리합니다. 쉘 변수를 큰따옴표로 묶는 것을 잊지 마세요!

답변2

export myvar
awk 'substr($0, 42) == ENVIRON["myvar"]' < "$filelist"

답변3

이는 다른 접근 방식입니다. 먼저 'line'을 비어 있게 설정한 다음 후행 3개 필드와 일치하는 항목을 찾으면 'myvar'를 설정합니다.

line=
while IFS=' ' read -r hex int1 int2 rest
do
  if [[ "$myvar" = "$int1 $int2 $rest" ]]
  then
    line="$hex $int1 $int2 $rest"
  fi
done < filelist

bash의 mapfile내장 및 두 번째 임시 연관 배열을 사용하는 또 다른 접근 방식은 다음과 같습니다.

mapfile -t < filelist # sets MAPFILE array
declare -A temparray
shopt -s extglob
for val in "${MAPFILE[@]}"
do 
  short="${val##*([^ ]) }"
  temparray[$short]="$val"
done
line=${m[$myvar]}
unset -v MAPFILE temparray val short

이는 파일을 인덱스 배열 MAPFILE에 넣은 다음 반복합니다. 이 루프는 "short" 변수를 줄의 "접미사" 부분으로 설정합니다. "0개 이상의 비공백 뒤에 공백이 오는" 패턴과 일치하는 선행 값을 제거한 다음 "$" short의 연관 배열 값을 설정합니다. "를 정수 라인("$val")으로 바꿉니다. 이 *작업이 필요합니다 shopt -s extglob. 그런 다음 line을 결과 값으로 설정합니다(또는 해당 값이 배열에 없으면 bash는 null/null을 반환합니다).

관련 정보