Làm thế nào để làm cho sed bỏ qua không phù hợp với dòng?


8

Trong ví dụ sau, sedkhớp các dòng bắt đầu bằng một ahoặc a cvà in ký tự đầu tiên của dòng đó ( ahoặc c):

$ echo "ag
bh
ci
dj
ek
fl" | sed 's/\(a\|c\)./\1/' # Matches lines starting with 'a' or 'c'.

output:
a
bh
c
dj
ek
fl

Tuy nhiên, các dòng không khớp với mẫu cũng được in ra. Làm thế nào để tôi biết sedbỏ qua các dòng không khớp với mẫu? Tôi có thể đạt được hiệu quả mong muốn bằng cách kết hợp nó với grep(như sau) nhưng tôi muốn biết liệu sedcó thể đạt được "chính nó" hay không.

$ echo "ag
bh
ci
dj
ek
fl" | grep '[ac]' | sed 's/\(a\|c\)./\1/'

output:
a
c

Nó không quan trọng đối với những gì bạn thực sự muốn biết, nhưng mô hình của bạn nên bắt đầu bằng ^ vì vậy nó được neo vào đầu dòng. Như được mã hóa, nó sẽ khớp với a hoặc c ở bất kỳ đâu trong dòng miễn là nó không phải là ký tự cuối cùng.
Joe

Câu trả lời:


12

Sử dụng no-printcờ ( -n) và in rõ ràng các lệnh thay thế thành công ( s///p):

 sed -n 's/\(a\|c\)./\1/p'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.