web-dev-qa-db-ja.com

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

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

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

今私は試しました:

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

すべての場合で$varには、入力ストリームの末尾の改行はありません。ありがとう。

また、入力にno末尾の改行がある場合、解はadd oneしてはなりません。

承認された回答に照らして更新:

コードで使用した最終的なソリューションは次のとおりです。

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のページで expandr 、小さなオープンソース git keyword-expansionフィルター の情報セキュリティ用に開発したシェルスクリプトをご覧ください。目的。 。gitattributes ファイル(ブランチ固有にすることができます)および git config で設定されたルールに従って、gitは各ファイルをでパイプしますexpandr.shリポジトリにチェックインまたはチェックアウトするときのシェルスクリプト。 (そのため、後続の改行またはその欠如を保持することが重要でした。)これにより、機密情報をクレンジングし、テスト、ステージング、およびライブブランチの環境固有の値の異なるセットを交換できます。

9
CommaToast

値が変数に格納される前に、末尾の改行が削除されます。あなたは次のようなことをしたいかもしれません:

var=`cat; echo x`

${var%x} の代わりに $var。例えば:

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

POSIXコマンド置換による であるため、これにより後続の改行の問題は解決されますが、ヌルバイト1は解決されません(標準入力がテキストでない場合)。

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

ただし、シェルの実装ではnullバイトが保持される場合があります。

7
vinc17

readビルトインを使用してこれを実現できます。

$ IFS='' read -d '' -r foo < <(echo bar)

$ echo "<$foo>"
<bar
>

スクリプトがSTDINを読み取るには、次のようにします。

IFS='' read -d '' -r foo

これがどのシェルで機能するかはわかりません。ただし、bashとzshの両方で正常に動作します。

4
Patrick

あなたは次のようにすることができます:

input | { var=$(sed '$s/$/./'); var=${var%.}; }

あなたが何をしても $var外に出るとすぐに消えます{ current Shell ; }とにかくグループ化。ただし、次のように機能することもできます。

var=$(input | sed '$s/$/./'); var=${var%.}
2
mikeserv