Đây là một sed
:
sed -e:n -e'/\n#.*\ndotan/!{$!{N;/^#/bn' \
-eb -e\} -e'/^#/s/\(\n\)\(dotan.*\)*/\1#\2/g' \
-et -e\} -eP\;D <in >out
Điều đó làm như bạn yêu cầu. Nó chỉ hoạt động trên một ngăn xếp - xây dựng nó khi cần thiết và miễn là cần thiết giữa các lần xuất hiện của các dòng nhận xét và bỏ bộ đệm cũ có lợi cho dòng nhận xét mới hơn nữa trong đầu vào khi tìm thấy. Hình ảnh...
Xin lỗi, tôi không biết tại sao tôi lại làm vậy. Nhưng nó đến với tâm trí.
Dù sao, sed
trải đều bộ đệm của nó giữa mỗi dòng nhận xét cuối cùng trong bất kỳ loạt nào, không bao giờ giữ lại một bộ đệm nào trong bộ đệm của nó hơn là cần thiết để theo dõi chính xác sự xuất hiện nhận xét cuối cùng và nếu bất cứ lúc nào nó gặp dòng cuối cùng trong khi thực hiện thì nó sẽ cố gắng g
tuyên bố thực hiện thùy cuối cùng và nhánh t
est toàn bộ bộ đệm sẽ được in, nếu không nó sẽP
trích xuất tất cả các dòng mà nó phát hành từ bộ đệm ngay khi nó được thực hiện.
Tôi đoán đây là những gì mang lại cho accordion tâm trí ...
printf %s\\n \#alice \#bob charlie dotan eric \
\#alice \#bob charlie dotan eric \
\#alice \#bob charlie dotan eric |
sed -e:n -e'l;/\n#.*\ndotan/!{$!{N;/^#/bn' \
-eb -e\} -e'/^#/s/\(\n\)\(dotan.*\)*/\1#\2/g' \
-et -e\} -eP\;D
#alice
#alice\n#bob$
#alice\n#bob\ncharlie$
#alice\n#bob\ncharlie\ndotan$
#alice
#bob\ncharlie\ndotan$
#bob\ncharlie\ndotan\neric$
#bob\ncharlie\ndotan\neric\n#alice$
#bob\ncharlie\ndotan\neric\n#alice\n#bob$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
#bob
charlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
charlie
dotan\neric\n#alice\n#bob\ncharlie\ndotan$
dotan
eric\n#alice\n#bob\ncharlie\ndotan$
eric
#alice\n#bob\ncharlie\ndotan$
#alice
#bob\ncharlie\ndotan$
#bob\ncharlie\ndotan\neric$
#bob\ncharlie\ndotan\neric\n#alice$
#bob\ncharlie\ndotan\neric\n#alice\n#bob$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
#bob
charlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
charlie
dotan\neric\n#alice\n#bob\ncharlie\ndotan$
dotan
eric\n#alice\n#bob\ncharlie\ndotan$
eric
#alice\n#bob\ncharlie\ndotan$
#alice
#bob\ncharlie\ndotan$
#bob\ncharlie\ndotan\neric$
#bob
#charlie
#dotan
eric
Chỉ có một sự khác biệt giữa lệnh này và lệnh trên và đó là l
lệnh ook ở trên cùng. Khi chúng ta l
nhìn vào sed
không gian mô hình khi nó hoạt động, chúng ta có thể hiểu rõ hơn về những gì diễn ra sau hậu trường và hiểu rõ hơn về cách điều khiển những nỗ lực của nó.
Trong trường hợp này, chúng ta có thể xem sed
đầu vào ngăn xếp cho đến khi tìm thấy lần xuất hiện thứ hai của \n#.*\ndotan
đầu vào và khi nó bắt đầu in ra một dòng trước đó một dòng. Thật tuyệt. Tôi đã học được rất nhiều làm việc về điều này.