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 g
lệnh không được đưa ra một dòng specifier, nhưng trước d
lệ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 g
chạ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
h
tiếp theo H
s trên mỗi dòng bản cho biết dòng đầu vào sed
của không gian giữ . (Hãy suy nghĩ bộ đệm văn bản tùy ý.)
- Sau đó,
d
loạ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,
g
khôi phục sự tích lũy của mỗi dòng từ không gian giữ để sed
có 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 \n
s.