sed - làm thế nào để loại bỏ tất cả các dòng không khớp


12

Tôi có một tệp html. Tôi muốn xóa tất cả các dòng không bắt đầu với <tr>.

Tôi đã thử:

cat my_file | sed $'
s/^[^tr].*//
' | sed '/^$/d'

nhưng nó đã xóa tất cả các dòng.


3
Dễ dàng hơn với grep.
jcbermu

1
s/^[^tr]...phù hợp với các dòng bắt đầu với bất kỳ nhân vật nào khác ngoài thoặc r. Dấu ngoặc vuông là một phạm vi ký tự trong biểu thức chính quy.
Peter Cordes

Câu trả lời:


18

Hãy thử điều này với GNU sed:

sed -n '/^<tr>/p' file

hoặc là

sed '/^<tr>/!d' file

1
Tôi thấy phiên bản này !dđặc biệt hữu ích vì nó cho phép bạn viết một lệnh sed khác trong biểu thức, trong khi đó pchỉ in khớp, nhưng lệnh tiếp theo có đầu vào không được xử lý.
jirislav

9
sed -e '/^<tr>/d'

Phần giữa /là một regex. Các dlệnh xóa dòng phù hợp.

Cập nhật: ôi, xin lỗi tôi thấy bạn nói KHÔNG. Vì thế

sed -e '/^<tr>/!d'

Trường hợp !phủ nhận ý nghĩa của trận đấu.


3

Nếu nó phải là sed:

sed -ni '/^<tr>/p' file

-ichỉnh sửa tệp tại chỗ, -nngăn không sedcho in tất cả các dòng, biểu thức chính quy có nghĩa là khớp với tất cả các dòng bắt đầu ( ^) <tr>và các dòng đó sẽ được in ( p).

Với grep:

grep -E '^<tr>' file

Với -Egrep phiên dịch mở rộng biểu thức chính quy.

Với awk:

awk '/^<tr>/' file

Hoặc nguyên chất bash:

while IFS= read -r l; do [[ "$l" =~ ^\<tr\> ]] && echo $l; done <file

Các [[bashs biểu hiện điều kiện nội bộ. Chúng tôi so sánh $lvới biểu thức chính quy và nếu nó được viết tắt ( &&), chúng tôi sẽ in dòng này echo.


Phiên bản bash thuần túy của bạn không trích dẫn "$l". Và bạn đang đặt nó làm đối số đầu tiên trên echodòng lệnh của mình, vì vậy bạn sẽ gặp vấn đề nếu nó bắt đầu bằng a -option. (Sử dụng printf '%s\n' "$l"). Also, shell read` phải đọc từng byte một lần, vì vậy nó rất chậm. Xử lý tệp văn bản trong bash thuần thường không phải là một lựa chọn tốt trừ khi bạn biết tệp của mình rất nhỏ.
Peter Cordes

2

Câu trả lời dễ nhất và đơn giản nhất sẽ là:

grep '^<tr>' path/to/file 

Điều này sẽ in ra tệp chỉ với các dòng bắt đầu có thể tốt nếu bạn không muốn sửa đổi tệp trực tiếp (như với sed).

Sau đó, nếu bạn thích những gì bạn thấy trong đầu ra, bạn có thể in ra một tệp với > file

Trong trường hợp này, bạn tiết kiệm thời gian sao lưu tệp của mình trước khi thử một số lệnh.

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.