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 を使用してレコードを選択し、2 番目と 3 番目の列を配列リンクに保存します。
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' -t、withを使用するとmapfile末尾を削除することを意味します。タブ、末尾の改行ではない場合。

このシェルはバージョン4.4以降で利用可能ですbashmapfile -dこのオプションの紹介は文書化されています。このように:

組み込み関数には、mapfile任意-dの文字をレコード区切り文字として使用するオプションと、提供された区切り文字を-t削除するオプションがあります-d

最後の要素を印刷したときにデータから末尾の改行を削除するには、要素を出力する"${Link[1]%$'\n'}"ときに使用します。最後の文字が改行文字の場合、要素から最後の改行文字が削除されます。

おすすめ記事