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 taillà tailcầ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 ( teethực hiện điều đó) mà là để đầu tailra 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 sedgiả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 sedvà 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 mypipevà đồng thời đến cat. Trước cattiên, tiện ích sẽ đọc đầu ra từ tail(đọc từ mypipe, teeghi 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ì teechữ viết mypipevà catsẽ 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ó. catsẽ không đọc từ đó cho đến khi tailhoàn thành. Và tailsẽ không hoàn thành cho đến khi teehoà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 đề.