Làm thế nào để loại bỏ các dòng ngắn hơn XY?


29

Tôi tìm thấy một câu hỏi về, làm thế nào để loại bỏ các dòng dài hơn 2048 ký tự:

Làm thế nào để xóa dòng nếu dài hơn XY?

Q: Nhưng làm thế nào tôi có thể loại bỏ các dòng ngắn hơn 4 ký tự? Vì vậy, loại bỏ các dòng có độ dài 1 hoặc 2 hoặc 3 trong một tệp.

CẬP NHẬT: Cảm ơn vì nhiều câu trả lời TỐT, nhưng tôi chỉ có thể đánh dấu một câu là OK

Câu trả lời:


42

Bạn có thể sử dụng sed. Sau đây sẽ xóa các dòng dài 3 ký tự hoặc nhỏ hơn:

sed -r '/^.{,3}$/d' filename

Để lưu các thay đổi vào tệp tại chỗ, hãy cung cấp -itùy chọn.

Nếu phiên bản của sedbạn không hỗ trợ cú pháp RE mở rộng, thì bạn có thể viết tương tự trong BRE:

sed '/^.\{,3\}$/d' filename

mà sẽ làm việc với tất cả các sedbiến thể.


Bạn cũng có thể sử dụng awk:

awk 'length($0)>3' filename

Sử dụng perl:

perl -lne 'length()>3 && print' filename

sed '/^.\{,3\}$/d'không hoạt động với BSD sed : sed: 1: "/^.\{,3\}$/d": RE error: invalid repetition count(s). Phiên bản sed -r có hiệu lực về mặt cú pháp, nhưng sẽ không xóa các dòng.
Dereckson

5

Một số biến thể khác:

grep .... file

hoặc là

sed '/..../!d' file

hoặc là

sed -n 's/./&/4p' file

hoặc là

awk 'gsub(/./,"&")>3' file

hoặc là

awk 'length>3' file

hoặc GNU awk:

awk 'NF>3' FS= file

1
Ôi cái grep đó .... thật tao nhã!
grofte

3

Đây là giải pháp Vim sử dụng chế độ Ex của Vim và globallệnh.

Điều này rất giống với việc sử dụng sed, chỉ có một số ký tự đặc biệt ('{', '}') cần phải được thoát.

:g/^.\{,3\}$/d

Sử dụng chế độ Very Magic Regex (\ v) của Vim, việc thoát này có thể tránh được.

:g/\v^.{,3}$/d

Xem thêm: giúp đỡ ma thuật

Use of "\v" means that in the pattern after it all ASCII characters except
'0'-'9', 'a'-'z', 'A'-'Z' and '_' have a special meaning.  "very magic"

Ngoài ra đôi khi hữu ích là làm ngược lại với vglobal.

:v/\v^.{,3}$/d

sẽ xóa tất cả mọi thứ trừ các dòng cho đến 3 ký tự.


1

để loại bỏ trực tiếp các dòng bạn có thể:

sed -ri '/.{4}/!d' /path/to/file

Hoặc BRE:

sed -i '/.\{4\}/!d' /path/to/file

Nếu một dòng không chứa 4 ký tự trở lên thì nó sẽ bị xóa.

f=/path/to/file
cat <<GREP >"$f"
    $(grep -E ".{4}" "$f")
GREP

Thực hiện như trên trong lớp con thay thế lệnh sẽ đảm bảo có grepđược một mô tả đọc trên nó trước khi con mèo bắt đầu viết cho nó, nhưng <<HEREDOCcũng sẽ đảm bảo rằng kết quả vẫn được truyền phát và không gây ra lỗi độ dài đối số.



0

Bạn có thể sử dụng grep:

Nếu bạn tính khoảng trắng hàng đầu theo chiều dài dòng:

grep -e '[^\ ]\{4,\}' file

Nếu bạn không tính khoảng trống hàng đầu trong dòng thứ năm:

grep -e '[^\]\{4,\}' file
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.