Tất cả mọi thứ được xem xét, ngấu nghiến toàn bộ tập tin có thể là cách nhanh nhất để đi.
Cú pháp cơ bản như sau:
sed -e '1h;2,$H;$!d;g' -e 's/__YOUR_REGEX_GOES_HERE__...'
Xin lưu ý, việc ngấu nghiến toàn bộ tệp có thể không phải là một lựa chọn nếu tệp quá lớn. Đối với những trường hợp như vậy, các câu trả lời khác được cung cấp ở đây cung cấp các giải pháp tùy chỉnh được đảm bảo hoạt động trên một dấu chân bộ nhớ nhỏ.
Đối với tất cả các tình huống hack và slash khác, chỉ cần chuẩn bị trước -e '1h;2,$H;$!d;g'theo sau bởi sedđối số regex ban đầu của bạn sẽ hoàn thành công việc.
ví dụ
$ echo -e "Dog\nFox\nCat\nSnake\n" | sed -e '1h;2,$H;$!d;g' -re 's/([^\n]*)\n([^\n]*)\n/Quick \2\nLazy \1\n/g'
Quick Fox
Lazy Dog
Quick Snake
Lazy Cat
Không gì -e '1h;2,$H;$!d;g'làm gì?
Các 1, 2,$, $!phụ tùng là dòng specifiers rằng giới hạn mà dòng lệnh trực tiếp sau chạy trên.
1: Chỉ dòng đầu tiên
2,$: Tất cả các dòng bắt đầu từ thứ hai
$!: Mỗi dòng khác nhau
Vì vậy, mở rộng, đây là những gì xảy ra trên mỗi dòng của đầu vào N dòng.
1: h, d
2: H, d
3: H, d
.
.
N-2: H, d
N-1: H, d
N: H, g
Các glệnh không được đưa ra một dòng specifier, nhưng trước dlệnh có một điều khoản đặc biệt " Bắt đầu chu kỳ tiếp theo. ", Và điều này ngăn gchạy trên tất cả các dòng ngoại trừ người cuối cùng.
Đối với ý nghĩa của từng lệnh:
- Là người đầu tiên
htiếp theo Hs trên mỗi dòng bản cho biết dòng đầu vào sedcủa không gian giữ . (Hãy suy nghĩ bộ đệm văn bản tùy ý.)
- Sau đó,
dloại bỏ từng dòng để ngăn những dòng này được ghi vào đầu ra. Các không gian tổ chức tuy nhiên được bảo tồn.
- Cuối cùng, trên dòng cuối cùng,
gkhôi phục sự tích lũy của mỗi dòng từ không gian giữ để sedcó thể chạy biểu thức chính của nó trên toàn bộ đầu vào (thay vì theo kiểu một thời điểm), và do đó có thể phù hợp trên \ns.