Array

Mapfile 不刪除尾隨換行符

  • July 26, 2021
  • 範例數據:製表符分隔的 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 選擇一條記錄,並將第 2 列和第 3 列儲存到數組 Link 中:
mapfile -d $'\t' -t Link < <(awk 'BEGIN{FS="\t"; OFS="\t"} {print $2,$3}' "${SessionP}" | fzf)

問題

在上面的命令中,我使用-t了 mapfile 選項,但echo "${Link[1]}"列印了一個尾隨的新行!

為什麼沒有被淘汰?


參考

檢查您的本地文件,而不是在網路上其他地方找到的文件。在互動式bashshell 會話中,鍵入help mapfile或查找手冊 ( )mapfile中的文件。根據您的 版本,文件可能與網路上的不同。bash``man bash``bash

在我的系統上,使用bash5.1.8,help mapfile記錄了這樣的-t選項mapfile

-t 從讀取的每一行中刪除尾隨的 DELIM(預設換行符)

DELIM設置為-d

-d delim 使用 DELIM 終止行,而不是換行

這意味著當使用-d $'\t' -twith時mapfile,它將刪除一個尾隨製表符(如果有的話),而不是尾隨換行符。

bash外殼mapfile -d自 4.4 版以來一直存在。此選項的介紹記錄如下

mapfile內置程序現在可以選擇-d使用任意字元作為記錄分隔符,並且可以-t選擇剝離分隔符,如-d.

要在列印最後一個元素時從數據中刪除尾隨換行符,請"${Link[1]%$'\n'}"在輸出元素時使用。如果最後一個字元是換行符,則從元素中刪除最後一個換行符。

引用自:https://unix.stackexchange.com/questions/659936