Đây là những sed
lệnh được thừa nhận là khó hiểu . Cụ thể (từ man sed
):
: nhãn
Nhãn cho các lệnh b và t.
nhãn t
Nếu as /// đã thực hiện thay thế thành công kể từ khi dòng đầu vào cuối cùng được đọc và kể từ lệnh t hoặc T cuối cùng, sau đó phân nhánh thành nhãn; nếu nhãn bị bỏ qua, nhánh đến cuối tập lệnh.
n N Đọc / nối dòng đầu vào tiếp theo vào không gian mẫu.
Vì vậy, tập lệnh bạn đã đăng có thể được chia thành (khoảng trắng được thêm vào để dễ đọc):
sed ':a; $!N; s/\n/string/; ta'
--- ---- ------------- --
| | | |--> go back (`t`) to `a`
| | |-------------> substitute newlines with `string`
| |----------------------> If this is not the last line (`$!`), append the
| next line to the pattern space.
|----------------------------> Create the label `a`.
Về cơ bản, những gì nó đang làm có thể được viết bằng mã giả như
while (not end of line){
append current line to this one and replace \n with 'string'
}
Bạn có thể hiểu điều này tốt hơn một chút với một ví dụ đầu vào phức tạp hơn:
$ printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;$!N;s/\n/string/;ta'
line1stringline2stringline3stringline4stringline5
Tôi không thực sự chắc chắn tại sao !$
cần thiết. Theo như tôi có thể nói, bạn có thể nhận được cùng một đầu ra với
printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;N;s/\n/string/;ta'