Làm cách nào để xóa các dòng khỏi tệp không chứa dấu chấm?


10

Tôi có một tập tin chứa dữ liệu bao gồm các url. Nhưng có nhiều dòng không phải là url. Làm thế nào tôi có thể loại bỏ chúng bằng cách sử dụng các lệnh đầu cuối Ubuntu?

Đây là tệp mẫu để tham khảo: Dữ liệu mẫu

com.blendtuts/S
°=
com.blengineering.www/:http
±=

Tôi muốn có đầu ra:

com.blendtuts/S
com.blengineering.www/:http

Các dòng không mong muốn thêm không có bất kỳ dấu chấm. Do đó, tôi muốn xóa các dòng không có dấu chấm

Câu trả lời:


30

Một cách với sed

sed '/\./!d' file
  • /\./khớp dấu chấm theo nghĩa đen (thoát với \vì nếu không .khớp với bất kỳ ký tự nào)
  • !d xóa tất cả mọi thứ trừ mẫu phù hợp

Nếu bạn muốn chỉnh sửa tập tin tại chỗ, hãy thêm -ivào lệnh sau khi thử nghiệm. (Bạn cũng có thể thêm .bakvào -icờ sed -i.bak ...để tạo bản sao lưu cục bộ của tệp.)

sed -i '/\./!d' file

26

Bạn có thể grep mọi thứ với một dấu chấm vào một tệp mới:

grep "\."  file > newfile

Bằng cách đó bạn có thể lưu tập tin cũ của bạn.


10

Hoặc giữ các dòng có chứa một dấu chấm ,

sed -ni.bak '/\./p' infile

8

Tôi nghĩ awkrằng đó là người cuối cùng mất tích cho bữa tiệc:

$ awk -F\. 'NF>1' file
com.blendtuts/S
com.blengineering.www/:http

Cái này đặt dấu phân cách trường thành dấu chấm. Sau đó, vấn đề là in những dòng có ít nhất hai trường: điều này có nghĩa là ít nhất một dấu chấm xảy ra.


3
Một giải pháp awk đơn giản hơn sẽ là thực hiện nó trong cùng một hướng với grep: awk '/\./' file- nghĩa là chỉ in các dòng có chứa ký tự '.'.
Chris Midgley

@ChrisHoạt động tốt! Vì đây là những gì câu trả lời grepđã được đề xuất, tôi thích đi với một số awkthứ cụ thể :)
fedorqui

6

Sử dụng perl:

perl -i -ne 'print if /\./' /path/to/file

6

Bạn có thể làm điều này khá dễ dàng với vim. Nếu bạn cảm thấy thoải mái khi sử dụng vim làm trình soạn thảo văn bản (mở, chỉnh sửa và viết tệp), thì hãy làm điều này:

:g!/\./d

Nếu bạn không thoải mái khi sử dụng vim hoặc bạn muốn sử dụng nó như một công cụ dòng lệnh, bạn có thể chỉ cần làm từ thiết bị đầu cuối:

vim file -c "g!/\./d" -c "wq"

Bạn có thể sửa đổi một chút để lưu vào một tệp mới:

vim file -c "g!/\./d" -c "w newfile" -c "q!"

Điều này sử dụng lệnh "toàn cầu" của vim, áp dụng lệnh ex cho mọi khớp dòng (hoặc không khớp) một biểu thức chính quy. Trong trường hợp này, lệnh là "(d) elete" và nó sẽ được áp dụng cho mọi lệnh không khớp với biểu thức chính quy\.

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.