2012-01-01 15 views
7

で「;エコー行うために行われ、」分割ラインは、私は、行を含むファイル(テストケース)を持っている、マックOSX上のbashにスペース

x xx xxx 
xxx xx x 

しかし、私は、コマンドを実行したときに

for i in `cat r.txt`; do echo "$i"; done 

結果は、私が望むよう

x xx xxx 
xxx xx x 

ではなく、むしろ

x 
xx 
xxx 
xxx 
xx 
x 

私は「xxxxxx」を返すようにしますか?

+0

AWK「GSUB(/ /、 "\ N"){印刷} ' または sedの//\ n/g' – kenny

答えて

16

デフォルトでは、Bash forループはすべての空白で分割されます。示唆されるようにIFSを設定

IFS=$'\n' 
for i in `cat r.txt`; do echo "$i"; done 
unset IFS 
+0

おそらく、読んでいる間にOPを指してください。行う ...;代わりに

+0

@Fredrik:おそらく、それは別のサブシェルで各反復を実行しますが... –

+0

完璧です。ありがとうございました。私は 'while'メソッドを見ていましたが、このエコーの問題よりもはるかに難しいと思われる他の問題がありました。 – atheaos

-1
IFS="\n" 
for i in `cat r.txt`; do echo "$i"; done 
unset IFS 
+1

動作しません... –

+0

@OliCharlesworthちなみに、私はあなたの答えをテストしていたので、私は誤って$を取り除いて、Arenielleのものを正確にタイプしました。出来た。 もっと複雑なデータで実行すると、明らかに他の副作用があることがわかります。 – atheaos

+0

@atheaos:本当ですか? Bashの '' \ n ''はCのものと同じではありません。 'echo" LINE:$ i "'実際に何が起こっているか見ることができます。 –

3

一方またはwhile使用:あなたはIFS変数を設定することにより、それを上書きすることができ

while read theline; do echo "$theline"; done <thefile 
+0

これは別のサブシェルで各繰り返しを実行することを指摘しておきます。 –

+0

はい、確かにそうです。編集されました。 – fge

+0

私が考えていた効率ではありません。代わりに、可変スコープの問題について考えていました(変数はループの「内側」と「外側」で共有されません)。 –

関連する問題