a.txt
以下の内容のファイルがあります
aaa
bbb
次のスクリプトを実行すると:
while read line
do
echo $line
done < a.txt > b.txt
生成されたb.txt
内容は次の通りです
aaa
bbb
行の先頭のスペースが削除されているようです。先頭のスペースを保持するにはどうすればよいでしょうか?
ベストアンサー1
これについては、Bash FAQのエントリで説明されています。データを行ごとに読み取る。
read コマンドは読み取られた各行を変更します。デフォルトでは、先頭と末尾の空白文字 (スペースとタブ、または IFS に存在する空白文字) がすべて削除されます。これが望ましくない場合は、IFS 変数をクリアする必要があります。
# Exact lines, no trimming while IFS= read -r line; do printf '%s\n' "$line" done < "$file"
Charles Duffy が正しく指摘しているように (そして私はそのIFS
問題に集中していたため見逃していました)、出力内のスペースを表示したい場合は、変数を使用するときにも引用符で囲む必要があります。そうしないと、シェルは再び空白を削除します。
引用されたスニペットと元のコードを比較した場合のその他のいくつかの違いについてのメモ。
引数の使用について-r
は、read
前にリンクしたページの上部にある 1 つの文で説明されています。
read の -r オプションは、バックスラッシュの解釈を防止します (通常、バックスラッシュと改行のペアとして使用され、複数の行にまたがります)。このオプションを指定しないと、入力内のバックスラッシュは破棄されます。read では、ほとんどの場合、-r オプションを使用する必要があります。
printf
thereの代わりにを使用する場合、echo
の動作はecho
、残念ながら、すべての環境にわたって移植性のある一貫性がなく、違いに対処するのが面倒になる可能性があります。printf
一方、 は一貫性があり、完全に堅牢に使用できます。