web-dev-qa-db-ja.com

Unixシェルスクリプトでファイルを1行ずつ(スペースを含めて)読み取る-問題

Unixシェルスクリプトで1行ずつファイルを読みたい。行には先頭と末尾のスペースを含めることができますが、行内のこれらのスペースも読みたいです。 「while read line」で試しましたが、readコマンドは行からスペース文字を削除しています:(ファイル内の行が次の場合の例:-

abcd efghijk
 abcdefg hijk

行は次のように読む必要があります:-1) "abcd efghijk" 2) " abcdefg hijk"

私が試したのはこれです(うまくいきませんでした):-

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

スペースとタブ文字を含む行が必要です。方法を提案してください。

18
Sourabh Saxena

これを試して、

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

編集:

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>''
26
sat

入力のバックスラッシュの問題を回避するためにraw行を読みたい(-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

cat < file.txtが改行で終わる限り、これはfile.txtと同等になりました。

Wordの分割によって行が個別の単語に分割されないようにするため、"$line"を二重引用符で囲む必要があります。このため、複数の空白シーケンスが失われます。

17
Jens