末尾の改行を削除せずにstdinを変数にキャプチャするにはどうすればよいですか?

末尾の改行を削除せずにstdinを変数にキャプチャするにはどうすればよいですか?

シェルスクリプトで...

末尾の改行を削除せずにstdinを変数にキャプチャするにはどうすればよいですか?

今私は次を試しました。

var=`cat`
var=`tee`
var=$(tee)

いずれの場合も、$var入力ストリームに末尾の改行はありません。ありがとうございます。

また: ある場合いいえ入力に末尾の改行文字がある場合、解決策は次のようになります。1つ追加

許可された回答に基づいて更新:

私のコードで使用した最終的な解決策は次のとおりです。

function filter() {
    #do lots of sed operations
    #see https://github.com/gistya/expandr for full code
}

GIT_INPUT=`cat; echo x`
FILTERED_OUTPUT=$(printf '%s' "$GIT_INPUT" | filter)
FILTERED_OUTPUT=${FILTERED_OUTPUT%x}
printf '%s' "$FILTERED_OUTPUT"

コード全体を見たい場合は、githubページをご覧ください。増量剤、少しオープンソースgitキーワード拡張フィルタ情報セキュリティの目的で開発したシェルスクリプトです。定められた規則に従って.git属性ファイル(支店によって異なる場合があります)と子の設定、gitは各ファイルをパイプします。エキスパンダーシェルスクリプトは、リポジトリにチェックインまたはチェックアウトするたびに実行されます。 (これが後続または欠落している改行を維持することが重要な理由です。)これにより、機密情報を整理し、テスト、ステージング、ライブブランチのさまざまな環境固有の値のセットを交換できます。

ベストアンサー1

値が変数に保存される前に、末尾の改行は削除されます。次の操作を実行できます。

var=`cat; echo x`

${var%x}代わりに使用してください$var。たとえば、次のようになります。

printf "%s" "${var%x}"

これは末尾の改行問題を解決しますが、NULLバイトの問題(stdinがテキストでない場合)は解決しません。POSIXコマンドによる交換:

出力に null バイトが含まれている場合、動作は指定されません。

ただし、シェル実装はヌルバイトを保持できます。

おすすめ記事