Có một vài cách để đi về w / sed. Một cách là đọc chậm như được khuyến nghị trong câu trả lời được chấp nhận. Nó cũng có thể được viết như sau:
sed -e '$!N;P;/\nPointer/r file1' -e D file2
... với một chút nhìn rõ phía trước thay vì nhìn phía sau được thực hiện ở nơi khác với bộ đệm giữ. Tuy nhiên, điều đó chắc chắn sẽ có cùng một vấn đề với dòng cuối cùng mà @don_crissti lưu ý, bởi vì N không làm tăng chu kỳ dòng và rlệnh ead được áp dụng theo số dòng.
Bạn có thể đi xung quanh nó:
echo | sed -e '$d;N;P;/\nPointer/r file1' -e D file2 -
Không phải tất cả seds sẽ diễn giải -ý nghĩa đầu vào tiêu chuẩn, nhưng nhiều người làm. ( POSIX nói sed nên hỗ trợ -có nghĩa là chuẩn trong nếu người triển khai muốn -có nghĩa là chuẩn trong ???)
Một cách khác là xử lý nội dung được nối theo thứ tự. Có một lệnh khác lên lịch đầu ra theo cách tương tự r, và sedsẽ áp dụng nó và rđọc theo thứ tự chúng được viết theo kịch bản. Đó là một chút tham gia nhiều hơn mặc dù - nó đòi hỏi phải sử dụng một sedđến append các Pointertrận đấu tới đầu ra của người khác sedtrong kịch bản của mình.
sed ' /Pointer/!d #only operate on first match
s/[]^$&\./*[]/\\&/g;H #escape all metachars, Hold
s|.*|/&/!p;//!d|p;g #print commands, exchange
s|.|r file1&a\\&|;q' file2| #more commands, quit
sed -nf - file2 #same input file
Vì vậy, về cơ bản, tập lệnh sedthứ nhất sedviết tập lệnh thứ hai , tập lệnh thứ hai sedđọc trên đầu vào tiêu chuẩn (có thể ...) và lần lượt áp dụng. Cái đầu tiên sedchỉ hoạt động trên trận đấu đầu tiên Pointerđược tìm thấy và sau đó là qđầu vào uits. Công việc của nó là ...
s/[]^$&\./*[]/\\&/g;H
- Hãy chắc chắn rằng tất cả các ký tự mẫu được thoát khỏi dấu gạch chéo một cách an toàn bởi vì ký tự thứ hai
sedsẽ cần diễn giải từng bit nó đọc theo nghĩa đen để làm cho đúng. Khi đã xong, đặt một bản sao trong Hkhông gian cũ.
s|.*|/&/!p;//!d|p; x
- Nói thứ hai
sedđể ptrích xuất mọi dòng đầu vào, !nhưng dòng /&/chúng ta chỉ bảo mật mẫu; và sau đó để xóa bỏ dtất cả như nhau. print các lệnh ở lần thứ hai sed, sau đó e xthay đổi hbộ đệm cũ và mẫu để làm việc trên bản sao đã lưu của chúng tôi.
s|.|r file1&a\\&|p;q
- Char duy nhất chúng tôi làm việc ở đây là một
\newline bởi vì sedsẽ có trước một khi chúng tôi đưa Hra dòng trước đó. Vì vậy, chúng tôi chèn lệnh r file1và làm theo nó với \newline của chúng tôi sau đó lệnh a\\cho ppend acũng theo sau bởi một \newline. Tất cả phần còn lại của Hdòng người lớn của chúng tôi theo \newline cuối cùng đó.
Kịch bản mà người viết đầu tiên trông giống như thế này:
/Pointer-file2 "23"/!p;//!d
r file1
a\
Pointer-file2 "23"
Về cơ bản, cái thứ hai sedsẽ in mọi dòng nhưng cái đầu tiên sedsẽ thiết lập nó thành append. Đối với dòng cụ thể đó, hai dòng ghi chậm vào tiêu chuẩn được lên lịch - đầu tiên là read của file1và thứ hai là một bản sao của dòng chúng tôi muốn sau nó. Việc sedlàm bác sĩ đầu tiên thậm chí không cần thiết trong trường hợp này (xem? Không có dấu gạch chéo ngược) nhưng điều quan trọng là phải thoát an toàn theo cách tôi làm ở đây bất cứ khi nào một kết quả khớp mẫu được đưa vào làm đầu vào.
Dù sao đi nữa, vì vậy ... có một vài cách.