This page is READ-ONLY. It is generated from the old site.
All timestamps are relative to 2013 (when this page is generated).
If you are looking for TeX support, please go to VietTUG.org

cat, for với khoảng trắng

...$cat với các dòng có khoảng trắng
Added by over 4 years ago

Giả sử có tập tin foobar với rất nhiều dòng. Trong từng dòng chứa dữ liệu bất kỳ, có thể bao gồm khoảng trắng

nội_dung_dòng_1
nội dung_dòng 2
nội_dung dòng_3

Ta muốn dùng cat để liệt kê tất cả các dòng của tập tin này, và thực hiện lệnh đối với từng kết quả. Để làm vậy, ta dùng vòng lặp for duyệt tuần tự

$ for f in `cat foobar`; do echo "$f"; done

Với cách này, kết quả sẽ tệ hại khi dòng nào đó có chứa khoảng trắng

nội_dung_dòng_1
nội
dung_dòng
2
nội_dung
dòng_3

Ảnh hưởng tới kết quả này là do biến IFS dùng để phân tách trường. Nếu thay đổi IFS thành dấu cariage_return\r thì sẽ có kết quả đẹp

$ IFS="\r" 
$ for f in `cat foobar`; do echo "$f"; done
nội_dung_dòng_1
nội dung_dòng 2
nội_dung dòng_3

Điều này chỉ hợp lý khi tập tin foobar chỉ sử dụng \r mà không sử dụng thêm dấu line_feed \n.

Tuy nhiên, cách làm này vẫn chuối. Nếu dòng nào đó chứa ký tự r thì xong phim:

$ cat foobar
nội_dung_dòng_1
nội dung_dòng 2
nội_dung rdòng_3

$ export IFS="\r" 
$ for f in `cat foobar`;do echo $f ; done
nội_dung_dòng_1
nội dung_dòng 2
nội_dung 
dòng_3

Lời giải chính xác là gì?

$ export IFS=$'\r'
$ for f in `cat foobar`;do echo $f ; done
nội_dung_dòng_1
nội dung_dòng 2
nội_dung rdòng_3

That's all?


Comments