Mapfile은 후행 줄 바꿈을 제거하지 않습니다.

Mapfile은 후행 줄 바꿈을 제거하지 않습니다.
  • 샘플 데이터: 탭으로 구분된 tsv 파일
a.1.58  fadado/CSV  https://github.com/fadado/CSV
a.1.63  jehiah/json2csv https://github.com/jehiah/json2csv
a.1.80  stedolan/jq https://github.com/stedolan/jq/issues/370
  • 다음은 fzf를 사용하여 레코드를 선택하고 두 번째 및 세 번째 열을 배열 링크에 저장합니다.
mapfile -d $'\t' -t Link < <(awk 'BEGIN{FS="\t"; OFS="\t"} {print $2,$3}' "${SessionP}" | fzf)

질문

위 명령에서 -tmapfile 옵션을 사용했는데, echo "${Link[1]}"후행 줄바꿈이 인쇄되었습니다!

왜 제거되지 않았나요?


인용하다

답변1

웹의 다른 곳에서 찾은 문서 대신 로컬 문서를 확인하세요. 대화형 셸 세션에서 bash설명서( )에 있는 help mapfile설명서를 입력하거나 찾습니다 . 버전에 따라 설명서가 온라인에서 찾은 내용과 다를 수 있습니다.mapfilebashman bashbash

내 시스템에서 bash5.1.8은 다음과 같은 옵션을 help mapfile문서화합니다 .-tmapfile

-t 읽은 각 줄에서 후행 DELIM(기본 개행)을 제거합니다.

DELIM로 설정 -d:

-d delim 줄 바꿈이 아닌 줄을 종료하려면 DELIM을 사용하십시오.

이는 -d $'\t' -twith 를 사용할 때 mapfile후행을 제거함을 의미합니다., 후행 줄 바꿈이 아닌 경우.

이 쉘은 버전 4.4부터 사용할 수 있습니다 bash. mapfile -d이 옵션의 소개는 문서화되어 있습니다.이와 같이:

내장 함수에는 mapfile이제 -d임의의 문자를 레코드 구분 기호로 사용하는 옵션과 -t제공된 구분 기호를 제거하는 옵션이 있습니다 -d.

마지막 요소를 인쇄할 때 데이터에서 후행 줄 바꿈을 제거하려면 "${Link[1]%$'\n'}"요소를 출력할 때 사용합니다. 마지막 문자가 개행 문자인 경우 요소에서 마지막 개행 문자가 제거됩니다.

답변2

입력 데이터( awk및 이후 fzf)가 다음과 같은 경우

fadado/CSV<tab>https://github.com/fadado/CSV<nl>

두 필드를 별도로 유지하려는 경우 mapfile반드시 최고의 도구는 아닙니다 . 대신 read -a읽기 배열을 사용하거나 read두 개의 변수 이름을 사용할 수 있습니다.

${arr[0]}그러면 두 필드를 모두 읽고${arr[1]}

IFS=$'\t' read -r -a arr < ...

또는

IFS=$'\t' read -r x y < ...

예를 들어(예를 들어 프로세스 대체를 건너뛰었습니다):

IFS=$'\t' read -r -a arr <<< $'fadado/CSV\thttps://github.com/fadado/CSV\n'
printf "'%s' '%s'\n" "${arr[0]}" "${arr[1]}"

인쇄

'fadado/CSV' 'https://github.com/fadado/CSV'

관련 정보