2012-06-11 17 views
17

Javaでは、特定のファイルが非常に小さいことがわかっている場合は、readBytes()メソッドを使用して、行ごとにまたはバッファを使用して読み取る代わりに、1つのコンテンツを読むことができます。私test.fileのような場合にはファイルの内容を一度に変数に読み込む方法は?

while read line 
    do 
     echo $line 
     LINE = $line 
    done < "test.file" 
    echo $LINE 

::ちょうどシェルスクリプトで不思議

は、私たちはのような何かを行うことができます知っている

testline1 
testline2 
testline3 

これは私だけ$LINEへの最後の行を提供します。 $LINEには「testline3」が含まれています。

私の質問は:1つの変数に複数の行を含むファイル全体を読むにはどうすればよいですか?$LINE="testline1\ntestline2\ntestline3"を得ることができますか?

+1

'DATA = $(猫ファイル)'、なぜあなたはしたいですか?コンテンツが必要なときはいつでもファイルを読んでください! –

+1

あなたの質問に直接関係しない2つの事柄:まず、 'LINE = $ line'は実際には動作しません。等号のまわりのスペースは無効にします。第2に、文字通り保存したいテキストを操作している場合は、読み込み呼び出しに対して 'IFS'をヌルに設定してください(それ以外の場合、各行の空白をヌルにします)。' -r'オプションを 'read'に渡します。 '-E'オプションを' echo'に設定します(そうしないと、ファイル内のバックスラッシュは何かを混乱させます)。たとえば、私の答えを見てください。 –

+0

@ MarkReed: '-E'の目的は、echoの' 'Bash''のデフォルトの動作以来理解できませんでした。 –

答えて

56

ループ内の行を処理するのではなく、ループ内で処理します。変数にファイルが本当に必要な場合:

var=$(<file) 
+0

ここで何が起こっているのか説明できますか? – sbhatla

+2

@sbhatla:変数は、ファイルの内容を読み取るリダイレクトを含むコマンド置換の値に設定されます。 'var = $(cat file)'と似ていますが、外部実行ファイルを生成する必要はありません。 –

8

別のオプションとして、行の配列を作成できます。その後

mapfile -t lines < <(tee /dev/tty <test.file) 

:あなたが行が出力されるようにしたいだけでなく、保存された場合は、このような何かを行うことができ

mapfile -t lines <test.file 

:あなたはbashの4+を実行している場合は、mapfile組み込みを使用することができます"${lines[0]}"はファイルの最初の行、"${lines[1]}"は2番目のようになります。 ${#lines[@]}は行数になります。 "${lines[@]}"は配列全体になりますが、"${lines[*]}"は空白を1つの大きな文字列に結合した行になります。 bashの古いバージョンのために

、手動で配列を構築することができます:

lines=() 
while IFS= read -r line 
do 
    printf '%s\n' "$line" 
    lines+=("$line") 
done < test.file 
+1

これは 'LINES + =(" $ line ")'と書くほうが簡単でしょうか? –

+0

私は4年後に少し学んだようです。知っておいてよかった。:) –

+0

私はそれをもう一度疑いません:) –

10

別の方法としては、素敵なマップファイルを組み込み使用することです:

mapfile < test.file 
echo "${MAPFILE[@]}" 
+2

マニュアルページはありませんが、 'help mapfile'はいくつかの情報を提供します。このユーティリティは、デフォルトで最初の行をエントリ0に、2行目をエントリ1に、というようにします。おそらく、 '-t'オプション(改行を取り除く)でそれを使用したいでしょう。 – parvus

+1

'mapfile'はbash 4に導入されているので、OS Xの'/bin/bash'では利用できません。おそらく、野生で遭遇する可能性が高いbash 3の最後の要塞ですが、アップルと新しいGPLに関するライセンス問題が原因である。 –

+1

AppleがMac OSからMacosにアップデートしたとき、bash 4.4が含まれていました。 – DopeGhoti

関連する問題