- 샘플 데이터: 탭으로 구분된 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)
질문
위 명령에서 -t
mapfile 옵션을 사용했는데, echo "${Link[1]}"
후행 줄바꿈이 인쇄되었습니다!
왜 제거되지 않았나요?
인용하다
답변1
웹의 다른 곳에서 찾은 문서 대신 로컬 문서를 확인하세요. 대화형 셸 세션에서 bash
설명서( )에 있는 help mapfile
설명서를 입력하거나 찾습니다 . 버전에 따라 설명서가 온라인에서 찾은 내용과 다를 수 있습니다.mapfile
bash
man bash
bash
내 시스템에서 bash
5.1.8은 다음과 같은 옵션을 help mapfile
문서화합니다 .-t
mapfile
-t
읽은 각 줄에서 후행 DELIM(기본 개행)을 제거합니다.
DELIM
로 설정 -d
:
-d delim
줄 바꿈이 아닌 줄을 종료하려면 DELIM을 사용하십시오.
이는 -d $'\t' -t
with 를 사용할 때 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'