Unixのシェルスクリプトで、ファイルを一行ずつ読みたいのですが。行には先頭や末尾にスペースが含まれることがあるので、それらのスペースも行の中で読みたいのです。 試しに、"while read line"を使ってみましたが、readコマンドが行からスペース文字を削除してしまいます :( 例)ファイルの行が次のような場合
abcd efghijk
abcdefg hijk
の場合、次のように読み込まれます。
1) "abcd efghijk" 2) "abcdefg hijk"
私が試したのは次のようなものです。
while read line
do
echo $line
done < file.txt
スペースとタブ文字を含んだ行が欲しいのですが。 方法を提案してください。
試してみてください。
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>''
入力中のバックスラッシュの問題を避けるために、*生の行を読みたい場合(-r
を使用)。
while read -r line; do
printf "<%s>\n" "$line"
done < file.txt
これは、行内のホワイトスペースを維持しますが、先頭と末尾のホワイトスペースを削除します。これらを維持するには、IFS を空にして、次のようにします。
while IFS= read -r line; do
printf "%s\n" "$line"
done < file.txt
これで、file.txt
が改行で終わる限り、cat < file.txt
と同等になります。
ただし、単語分割によって行が別々の単語に分割されないようにするためには、 "$line"
をダブルクォートにしなければなりません(複数のホワイトスペースが失われます)。