Mapfile 不删除尾随换行符

Por*_*ine 2 array gnu newlines fzf

  • 示例数据:制表符分隔的 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
Run Code Online (Sandbox Code Playgroud)
  • 以下使用 fzf 选择一条记录,并将第 2 和第 3 列存储到数组 Link:
mapfile -d $'\t' -t Link < <(awk 'BEGIN{FS="\t"; OFS="\t"} {print $2,$3}' "${SessionP}" | fzf)
Run Code Online (Sandbox Code Playgroud)

问题

在上面的命令中,我使用-t了 mapfile 选项,但echo "${Link[1]}"打印了一个新的行尾!

为什么没有被淘汰?


参考

Kus*_*nda 6

检查您的本地文档,而不是在网络上其他地方找到的文档。在交互式bashshell 会话中,键入help mapfile或查找手册 ( )mapfile中的文档。根据您的 版本,文档可能与网络上的内容有所不同。bashman bashbash

在我的系统上,使用bash5.1.8,help mapfile记录了这样的-t选项mapfile

-t 从每行读取中删除尾随 DELIM(默认换行符)

DELIM设置有-d

-d delim 使用 DELIM 来终止行,而不是换行

这意味着当使用-d $'\t' -twith 时mapfile,它会删除一个尾随制表符(如果有的话),而不是尾随换行符。

从 4.4 版开始,bashshell 就有了mapfile -d。引入这个选项的被记录这样的

mapfile内建现在有一个-d使用任意字符作为记录分隔符,以及选项-t与供给到剥离分隔符选项-d

要在打印最后一个元素时从数据中删除尾随换行符,请"${Link[1]%$'\n'}"在输出元素时使用。如果最后一个字符是换行符,这将从元素中删除最后一个换行符。