테이블 파일이 있습니다
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
같은 특수 기호가 포함될 수 있다는 것입니다 . 나는 공연하고 싶다.
+
^
$
grep
grep
정밀한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을 반환합니다).