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à r
lệ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ả sed
s 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à sed
sẽ á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 a
ppend các Pointer
trận đấu tới đầu ra của người khác sed
trong 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 sed
thứ nhất sed
viế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 sed
chỉ 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
sed
sẽ 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 H
không gian cũ.
s|.*|/&/!p;//!d|p; x
- Nói thứ hai
sed
để p
trí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ỏ d
tất cả như nhau. p
rint các lệnh ở lần thứ hai sed
, sau đó e x
thay đổi h
bộ đệ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
\n
ewline bởi vì sed
sẽ có trước một khi chúng tôi đưa H
ra dòng trước đó. Vì vậy, chúng tôi chèn lệnh r file1
và làm theo nó với \n
ewline của chúng tôi sau đó lệnh a\\
cho ppend a
cũng theo sau bởi một \n
ewline. Tất cả phần còn lại của H
dòng người lớn của chúng tôi theo \n
ewline 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 sed
sẽ in mọi dòng nhưng cái đầu tiên sed
sẽ thiết lập nó thành a
ppend. Đố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à r
ead của file1
và thứ hai là một bản sao của dòng chúng tôi muốn sau nó. Việc sed
là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.