次のファイルがあるとします。
$ cat /tmp/test.txt
Line 1
Line 2 has leading space
Line 3 followed by blank line
Line 5 (follows a blank line) and has trailing space
Line 6 has no ending CR
多くのBashソリューションによって読み取られるファイル出力の意味を変更する4つの要素があります。
- 空白行4;
- 2行の先頭または末尾のスペース。
- 個々の行の意味を維持する(つまり、各行はレコードです)。
- 行6はCRで終了していません。
空白行とCRなしの終了行を含む行ごとにテキストファイルが必要な場合は、whileループを使用し、最終行の代替テストを行う必要があります。
以下は、ファイルを変更する可能性のあるメソッドです(何cat
が返されるかと比較して)。
1)最後の行と先頭と末尾のスペースを失う:
$ while read -r p; do printf "%s\n" "'$p'"; done </tmp/test.txt
'Line 1'
'Line 2 has leading space'
'Line 3 followed by blank line'
''
'Line 5 (follows a blank line) and has trailing space'
(while IFS= read -r p; do printf "%s\n" "'$p'"; done </tmp/test.txt
代わりに行う場合、先頭と末尾のスペースは保持されますが、CRで終了していない場合は最後の行が失われます)
2)cat
willでプロセス置換を使用すると、ファイル全体が一気に読み取られ、個々の行の意味が失われます。
$ for p in "$(cat /tmp/test.txt)"; do printf "%s\n" "'$p'"; done
'Line 1
Line 2 has leading space
Line 3 followed by blank line
Line 5 (follows a blank line) and has trailing space
Line 6 has no ending CR'
("
から$(cat /tmp/test.txt)
ファイルを削除した場合、ファイルを一口ずつではなく、単語ごとに読み取ります。また、意図したものではないかもしれません...)
ファイルを1行ずつ読み取り、すべての間隔を維持する最も堅牢で最も簡単な方法は次のとおりです。
$ while IFS= read -r line || [[ -n $line ]]; do printf "'%s'\n" "$line"; done </tmp/test.txt
'Line 1'
' Line 2 has leading space'
'Line 3 followed by blank line'
''
'Line 5 (follows a blank line) and has trailing space '
'Line 6 has no ending CR'
リーディングスペースとトレーディングスペースを削除する場合は、IFS=
パーツを削除します。
$ while read -r line || [[ -n $line ]]; do printf "'%s'\n" "$line"; done </tmp/test.txt
'Line 1'
'Line 2 has leading space'
'Line 3 followed by blank line'
''
'Line 5 (follows a blank line) and has trailing space'
'Line 6 has no ending CR'
(終端なしのテキストファイルは\n
、かなり一般的な一方で、POSIXの下で壊れたと考えられている。あなたは、末尾に数えることができるならば\n
、あなたが必要としない|| [[ -n $line ]]
でwhile
ループで。)
BASH FAQの詳細