cat <<EOS | sed -ne '1{h;d;}' -e 'H;${G;p;}'
line 1
line 2
line 3
EOS
Vấn đề với việc dịch cái này sang cái gì đó sử dụng tail
là tail
cần phải đọc toàn bộ tập tin để tìm ra kết thúc của nó. Để sử dụng nó trong đường ống của bạn, bạn cần phải
- Cung cấp đầy đủ nội dung của tài liệu cho
tail
.
- Cung cấp lại cho
cat
.
- Theo thứ tự đó.
Một mẹo nhỏ không phải là sao chép nội dung của tài liệu ( tee
thực hiện điều đó) mà là để đầu tail
ra xảy ra trước khi phần còn lại của tài liệu được xuất ra, mà không sử dụng tệp tạm thời trung gian.
Việc sử dụng sed
(hoặc awk
, như John1024 thực hiện ) sẽ loại bỏ việc phân tích cú pháp dữ liệu kép và vấn đề đặt hàng bằng cách lưu trữ dữ liệu trong bộ nhớ.
Các sed
giải pháp mà tôi đề xuất là để
1{h;d;}
, lưu trữ dòng đầu tiên trong không gian giữ, nguyên trạng và bỏ qua dòng tiếp theo.
H
, nối các dòng khác vào không gian giữ bằng một dòng mới được nhúng.
${G;p;}
, nối không gian giữ vào dòng cuối cùng với một dòng mới được nhúng và in dữ liệu kết quả.
Đây là bản dịch hoàn toàn theo nghĩa đen của giải pháp John1024 sed
, với lời cảnh báo rằng tiêu chuẩn POSIX chỉ đảm bảo rằng không gian lưu trữ ở mức tối thiểu 8192 byte (8 KiB; nhưng nó khuyến nghị rằng bộ đệm này được phân bổ và mở rộng một cách linh hoạt khi cần, cả GNU sed
và BSD sed
đang làm).
Nếu bạn cho phép mình sử dụng một đường ống có tên:
mkfifo mypipe
cat <<EOS | tee mypipe | cat <( tail -n 1 mypipe ) -
line 1
line 2
line 3
EOS
rm -f mypipe
Điều này sử dụng tee
để gửi dữ liệu xuống mypipe
và đồng thời đến cat
. Trước cat
tiên, tiện ích sẽ đọc đầu ra từ tail
(đọc từ mypipe
, tee
ghi vào), sau đó nối thêm bản sao của tài liệu đến trực tiếp từ đó tee
.
Có một lỗ hổng nghiêm trọng trong vấn đề này, ở chỗ, nếu tài liệu quá lớn (lớn hơn kích thước bộ đệm của đường ống), thì tee
chữ viết mypipe
và cat
sẽ bị chặn trong khi chờ ống (không tên) bị trống. Nó sẽ không được làm trống cho đến khi cat
đọc từ nó. cat
sẽ không đọc từ đó cho đến khi tail
hoàn thành. Và tail
sẽ không hoàn thành cho đến khi tee
hoàn thành. Đây là một tình huống bế tắc cổ điển.
Các biến thể
tee >( tail -n 1 >mypipe ) | cat mypipe -
có cùng một vấn đề.