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


21

Làm thế nào tôi có thể xóa một dòng nếu nó dài hơn ví dụ: 2048 ký tự?


Bạn có khăng khăng sử dụng sed? Điều này là dễ dàng, ví dụ trong python. Và không có nghi ngờ thậm chí dễ dàng hơn trong perl. Mặc dù câu hỏi không được xác định rõ ràng. Sao chép một tập tin, loại bỏ tất cả các dòng dài hơn 2048, hoặc cái gì khác?
Faheem Mitha

Câu trả lời:


22
sed '/^.\{2048\}./d' input.txt > output.txt

3
Tôi nhận được thông báo lỗi sed: 1: "/^.\{2048\}..*/d": RE error: invalid repetition count(s)(Mac OS X)
wedi

1
@wedi có lẽ bạn muốn cài đặt phiên bản GNU thay vì phiên bản BSD đi kèm với Mac. Điều này thật dễ dàng với bia
Freedom_Ben

Câu hỏi cho biết "nếu dài hơn XY (ví dụ: 2048 ký tự)". Sau đó, nó phải> 2048 và không => 2048
ajcg

1
@ajcg, Đó là> 2048. Lưu ý rằng có thêm một khoảng thời gian ở cuối regex để khớp với ký tự thứ 2049.
Forcefsck

@forcefsck và sẽ tốt hơn nếu bạn mang nó đi "^"? (với lệnh của bạn, bạn chỉ xóa các dòng "bắt đầu bằng XYZ", nhưng nếu XYZ nằm trong một phần khác của dòng thì nó sẽ không xóa nó)
ajcg

7

Đây là một giải pháp xóa các dòng có 2049 ký tự trở lên:

sed -E '/.{2049}/d' <file.in >file.out

Biểu thức /.{2049}/dsẽ khớp với bất kỳ dòng nào chứa ít nhất 2049 ký tự và xóa chúng khỏi đầu vào, chỉ tạo ra dòng ngắn hơn trên đầu ra.

Với awk, dòng in có độ dài 2048 hoặc ngắn hơn:

awk 'length <= 2048' <file.in >file.out

Bắt chước sedgiải pháp theo nghĩa đen với awk:

awk 'length >= 2049 { next } { print }' <file.in >file.out

1
Tôi nhận được thông báo lỗi sed: 1: "/^.\{400,\}$/d": RE error: invalid repetition count(s)(Mac OS X)
wedi

1
@wedi Bây giờ được cập nhật và thử nghiệm trên macOS Mojave.
Kusalananda

2

Một cái gì đó như thế này sẽ hoạt động trong Python.

of = open("orig")
nf = open("new",'w')
for line in of:         
    if len(line) < 2048:
        nf.write(line)
of.close()
nf.close()

1
Cá nhân, @Faheem, tôi thích câu trả lời của bạn. Lý do là tôi rất dễ biến nó thành 'xóa tất cả các dòng nhỏ hơn x'. Tôi không sử dụng Python mọi lúc, nhưng khi tôi làm tôi luôn cảm thấy mình nên học tốt nó.
ixtmixilix

@ixtmixilix: Có, sử dụng ngôn ngữ đầy đủ tính năng như Python khá linh hoạt. Cảm ơn đã bình luận.
Faheem Mitha

2
perl -lne "length < 2048 && print" infile > outfile

+1 Tuy nhiên, -lkhông cần thiết.
Joseph R.

Không làm việc cho tôi. Perl v5.16.2. Warning: Use of "length" without parentheses is ambiguous at -e line 1. Unterminated <> operator at -e line 1.
wedi

Bạn có thể thử length($_) > 2048 && print. lengthlà một phím tắt cho length($_)dù sao.
MaratC

0

Các câu trả lời trên không hoạt động với tôi trên Mac OS X 10.9.5.

Đoạn mã sau không hoạt động:

sed '/.\{2048\}/d'.

Mặc dù không được hỏi, nhưng được cung cấp để tham khảo, điều ngược lại có thể đạt được mã sau đây:

sed '/.\{2048\}/!d'.


lol, nhưng sed: 1: "/.\{2048\}/d": RE error: invalid repetition count(s)( Mac OS X, 10.10.4)
alex xám

À. Tôi đã cài đặt phiên bản GNU thay vì phiên bản BSD đi kèm với Mac như @Freedom_Ben đã đề xuất ở trên. Nhưng Kusalananda đã tìm thấy công tắc để kích hoạt regex mở rộng. Vì vậy, bạn nên đi với giải pháp của anh ấy nếu bạn vẫn còn vấn đề đó. ;)
wedi

0

Với gnu-sed, bạn có thể sử dụng cờ -r, để tránh nhập dấu gạch chéo ngược và dấu phẩy để xác định khoảng thời gian mở:

sed -r  "/.{2049,}/d" input.txt > output.txt

với:

  • x {2049} có nghĩa chính xác là 2049 xs
  • x {2049,3072} có nghĩa là từ 2049 đến 3072 xs
  • x {2049,} có nghĩa là ít nhất 2049 xs
  • x {, 2049} có nghĩa là nhiều nhất là 2049 xs

Trong các khoảng thời gian, để không khớp với các mẫu lớn hơn, bạn sẽ cần các neo dòng như

sed -r  "/^.{32,64}$/d" input.txt > output.txt 
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.