2013-05-28 8 views
15

Unixシェルスクリプトでファイルを1行ずつ読みたいです。行に先頭と末尾のスペースが含まれている可能性があります。また、その行内のスペースも読みたいと思います。 私が「しばらく読み取りライン」を試してみましたが、コマンドが行から空白文字を削除して読ん:( 例をファイル内の行がある場合: - : 1) "abcd efghijk" 2) " abcdefg hijk"Unixシェルスクリプトでファイルを1行ずつ(空白で)読み込む - 問題

何 -

abcd efghijk 
abcdefg hijk 

ラインはとして読まれるべき私が試したこれは(働いていないもの)である: - 。。

while read line 
do 
    echo $line 
done < file.txt 

私はそれにスペースやタブ文字を含む行をしたい 方法を提案してください

答えて

22

これを試してみて、

IFS='' 
while read line 
do 
echo $line 
done < file.txt 

EDIT:

あなたが入力でバックスラッシュの問題を回避するためにラインを読みたいman bash

IFS - The Internal Field Separator that is used for word 
splitting after expansion and to split lines into words 
with the read builtin command. The default value is 
``<space><tab><newline>'' 
+0

それがうまくいった!おかげさまで IFSについては Plzについて説明します。 –

+0

がポストを更新しました。 – sat

+7

奇妙なことに、奇妙な副作用を避けるために 'read'文のために空の' IFS'を指定します: 'IFS = read line' – l0b0

15

から(-rを使用します) :

while read -r line; do 
    printf "<%s>\n" "$line" 
done < file.txt 

これは、行内の空白を維持しますが、先頭と末尾の空白を削除します。

while IFS= read -r line; do 
    printf "%s\n" "$line" 
done < file.txt 

これのように、空のIFSを設定し、同様にそれらを保つためには、今限りfile.txtは改行で終わるようcat < file.txtのと同じです。

ワード分割が行を別々の単語に分割しないように、複数の空白文字列を失うためには、"$line"を二重引用符で囲む必要があります。

+0

それを説明してくれてありがとう。 –

+2

@SourabhSaxenaよろしくお願いします。 Stackoverflowで "感謝"を表現する方法は、答えの左にある上向き矢印をクリックしてupvoteすることです。 – Jens

関連する問題