Tổng hợp
Cú pháp GNU:
sed '/claudio/{s//claudia/;:p;n;bp}' file
Hoặc thậm chí (chỉ sử dụng một lần từ được thay thế:
sed '/\(claudi\)o/{s//\1a/;:p;n;bp}' file
Hoặc, theo cú pháp POSIX:
sed -e '/claudio/{s//claudia/;:p' -e 'n;bp' -e '}' file
hoạt động trên bất kỳ sed, chỉ xử lý nhiều dòng cần thiết để tìm đầu tiên claudio
, hoạt động ngay cả khiclaudio
ở dòng đầu tiên và ngắn hơn vì nó chỉ sử dụng một chuỗi regex.
Chi tiết
Để chỉ thay đổi một dòng, bạn chỉ cần chọn một dòng.
Sử dụng một 1,/claudio/
(từ câu hỏi của bạn) chọn:
- từ dòng đầu tiên (vô điều kiện)
- đến dòng tiếp theo chứa chuỗi
claudio
.
$ cat file
claudio 1
antonio 2
claudio 3
michele 4
$ sed -n '1,/claudio/{p}' file
claudio 1
antonio 2
claudio 3
Để chọn bất kỳ dòng nào có chứa claudio
, sử dụng:
$ sed -n `/claudio/{p}` file
claudio 1
claudio 3
Và để chỉ chọn đầu tiên claudio
trong tệp, sử dụng:
sed -n '/claudio/{p;q}' file
claudio 1
Sau đó, bạn chỉ có thể thay thế trên dòng đó:
sed '/claudio/{s/claudio/claudia/;q}' file
claudia 1
Điều này sẽ chỉ thay đổi lần xuất hiện đầu tiên của trận đấu regex trên dòng, ngay cả khi có thể có nhiều hơn một, trên lần đầu tiên dòng khớp với biểu thức chính quy.
Tất nhiên, /claudio/
regex có thể được đơn giản hóa thành:
$ sed '/claudio/{s//claudia/;q}' file
claudia 1
Và, sau đó, điều duy nhất còn thiếu là in tất cả các dòng khác chưa được sửa đổi:
sed '/claudio/{s//claudia/;:p;n;bp}' file
info sed
: (0,/REGEXP/
: Một số dòng từ 0 có thể được sử dụng trong một đặc điểm kỹ thuật địa chỉ như0,/REGEXP/
vậy màsed
sẽ cố gắng để phù hợp với REGEXP trong dòng đầu vào đầu tiên quá Nói cách khác,.0,/REGEXP/
Là tương tự1,/REGEXP/
, ngoại trừ nếu ADDR2 khớp với dòng đầu tiên đầu tiên thì 0, / REGEXP / biểu mẫu sẽ xem xét nó kết thúc phạm vi, trong khi biểu mẫu 1, / REGEXP / sẽ khớp với đầu phạm vi của nó và do đó tạo ra khoảng phạm vi cho đến lần xuất hiện thứ hai của biểu thức chính quy)