2011-11-22 33 views
5

Từ các tài liệu sed:lệnh 'd' trong tiện ích sed

d  Delete the pattern space; immediately start next cycle. 

có nghĩa là gì bởi chu kỳ tiếp theo? Tôi hiểu rằng sed sẽ không áp dụng các lệnh sau sau lệnh d và bắt đầu đọc dòng tiếp theo từ luồng đầu vào và xử lý nó. Nhưng có vẻ như đây không phải là sự thật. Xem exampel này:

[[email protected] ~]# cat -A test.txt 
aaaaaaaaaaaaaa$ 
$ 
bbbbbbbbbbbbb$ 
$ 
$ 
ccccccccc$ 
ddd$ 
$ 
eeeeeee$ 
[[email protected] ~]# cat test.txt | sed '/^$/d;p;p' 
aaaaaaaaaaaaaa 
aaaaaaaaaaaaaa 
aaaaaaaaaaaaaa 
bbbbbbbbbbbbb 
bbbbbbbbbbbbb 
bbbbbbbbbbbbb 
ccccccccc 
ccccccccc 
ccccccccc 
ddd 
ddd 
ddd 
eeeeeee 
eeeeeee 
eeeeeee 
[[email protected] ~]# 

Nếu ngay lập tức bắt đầu chu kỳ tiếp theo, lệnh p sẽ không có bất kỳ đầu ra.

Bất cứ ai cũng có thể giúp tôi giải thích điều đó? Cảm ơn.

Trả lời

7

Điều đó có nghĩa là sed sẽ đọc dòng tiếp theo và bắt đầu xử lý nó.

Tập lệnh thử nghiệm của bạn không làm những gì bạn nghĩ. Nó khớp với các dòng trống và áp dụng lệnh delete cho chúng. Chúng không xuất hiện, vì vậy các câu lệnh in không được áp dụng cho các dòng trống. Hai lệnh in không được kết nối với mẫu cho lệnh xóa, vì vậy các dòng không trống được in ba lần. Thay vào đó, nếu bạn thử

sed '/./d;p;p' test.txt # matches all non-empty lines 

không có gì sẽ được in ngoài dòng trống, ba lần mỗi dòng.

+0

Tôi hiểu rồi. Cảm ơn! –

+0

Bạn được chào đón! –

1

a) Bạn có thể kết hợp nhiều lệnh cho một mô hình với dấu ngoặc nhọn:

sed '/^$/{d;p;p}' test.txt 

aaaaaaaaaaaaaa 
bbbbbbbbbbbbb 
ccccccccc 
ddd 
eeeeeee 

Lệnh d chỉ được áp dụng cho dòng sản phẩm nào ở đây: '/^$/d; p; p'. Khác dòng được in 2 lần. Để liên kết lệnh 'p'-với mẫu, bạn phải tạo dấu ngoặc nhọn. Sau đó, lệnh p cũng được bỏ qua, nhưng vì bỏ qua chu kỳ tiếp theo, không phải vì nó không khớp.

b) Sử dụng mèo không sử dụng. (đã được hiển thị)

+0

Đã làm như vậy, đã xóa nhận xét. –