@Ed Morton: Tôi không đồng ý với bạn ở đây. Tôi thấy sed
rất hữu ích và đơn giản (một khi bạn tìm hiểu khái niệm về mô hình và giữ bộ đệm) để tìm ra một cách thanh lịch để thực hiện chuyển đổi đa dòng.
Ví dụ, chúng ta hãy lấy một tệp văn bản có tên máy chủ và một số thông tin về mỗi máy chủ lưu trữ, với rất nhiều rác ở giữa mà tôi không quan tâm.
Host: foo1
some junk, doesnt matter
some junk, doesnt matter
Info: about foo1 that I really care about!!
some junk, doesnt matter
some junk, doesnt matter
Info: a second line about foo1 that I really care about!!
some junk, doesnt matter
some junk, doesnt matter
Host: foo2
some junk, doesnt matter
Info: about foo2 that I really care about!!
some junk, doesnt matter
some junk, doesnt matter
Đối với tôi, một tập lệnh awk để chỉ lấy các dòng có tên máy chủ và info
dòng tương ứng sẽ mất nhiều hơn một chút so với những gì tôi có thể làm với sed:
sed -n '/Host:/{h}; /Info/{x;p;x;p;}' myfile.txt
đầu ra trông giống như:
Host: foo1
Info: about foo1 that I really care about!!
Host: foo1
Info: a second line about foo1 that I really care about!!
Host: foo2
Info: about foo2 that I really care about!!
(Lưu ý rằng nó Host: foo1
xuất hiện hai lần trong đầu ra.)
Giải trình:
-n
tắt đầu ra trừ khi được in rõ ràng
- kết hợp đầu tiên, tìm và đặt
Host:
dòng vào bộ đệm giữ (h)
- khớp thứ hai, tìm dòng Info: tiếp theo, nhưng trước tiên trao đổi (x) dòng hiện tại trong bộ đệm mẫu với bộ đệm giữ và in (p)
Host:
dòng, sau đó trao đổi lại (x) và in (p) dòng Info:.
Vâng, đây là một ví dụ đơn giản, nhưng tôi nghi ngờ đây là một vấn đề phổ biến đã được xử lý nhanh chóng bởi một lớp lót sed đơn giản. Đối với các nhiệm vụ phức tạp hơn nhiều, chẳng hạn như những nhiệm vụ mà bạn không thể dựa vào một trình tự nhất định, có thể dự đoán được, awk có thể phù hợp hơn.
echo $'1\n2\n3\n4' | sed -n '1~2h;2~2{p;x;p}'