Nhận nội dung trước dấu hai chấm


8

Tôi có một tệp văn bản trên Linux với nội dung như dưới đây:

help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com

Tôi muốn lấy nội dung trước dấu hai chấm như bên dưới:

help.helloworld.com
dev.helloworld.com

Làm thế nào tôi có thể làm điều đó trong thiết bị đầu cuối?


2
Các greptiện ích được sử dụng để tìm kiếm các dòng phù hợp với biểu thức thông thường. Bạn có thể có thể sử dụng nó ở đây, nhưng sẽ phù hợp hơn khi sử dụng một công cụ trích xuất dữ liệu từ các trường được cung cấp một số dấu phân cách, chẳng hạn như cuttiện ích.
Kusalananda

Tôi đã gửi một bản chỉnh sửa để loại bỏ từ "grep" và thay thế nó bằng "find" trong tiêu đề và "get" trong phần thân câu hỏi, để tránh vấn đề X / Y giả định greplà công cụ phù hợp để giải quyết thực tế vấn đề.
Monty Harder

1
Tất cả những gì tôi có thể nói là nội dung trước dấu hai chấm tốt hơn nhiều so với nội dung sau dấu hai chấm ;-).
Peter - Tái lập Monica

Câu trả lời:


35

Đây là những gì cutdành cho:

$ cat file
help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
foo:baz:bar
foo

$ cut -d: -f1 file
help.helloworld.com
dev.helloworld.com
foo
foo

Bạn chỉ cần đặt các dấu phân cách để :với -d:và nói với nó để chỉ in các lĩnh vực 1 ( -f1).


19

Hoặc thay thế:

$ grep -o '^[^:]*' file
help.helloworld.com
dev.helloworld.com

Điều này trả về bất kỳ ký tự nào bắt đầu ở đầu mỗi dòng ( ^) không có dấu hai chấm ( [^:]*).


18

Chắc chắn sẽ đề nghị awk:

awk -F ':' '{print $1}' file

Sử dụng :như một dấu tách trường và in trường đầu tiên.


5

cập nhật câu trả lời

Xem xét các tập tin sau file.txt:

help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
no.colon.com
colon.at.the.end.com:

Bạn có thể sử dụng sedđể loại bỏ mọi thứ sau dấu hai chấm:

sed -e 's/:.*//' file.txt

Điều này hoạt động cho tất cả các trường hợp góc được chỉ ra trong các bình luận, nếu nó kết thúc bằng dấu hai chấm hoặc nếu không có dấu hai chấm, mặc dù những điều này không được đề cập trong chính câu hỏi. Cảm ơn @Rakesh Sharma, @mirabilos và @Freddy vì những bình luận của họ. Trả lời câu hỏi là một cách tuyệt vời để học hỏi.


4
sed -e 's/:.*//' file.txtlà một cách khác với Posix sed.
Rakesh Sharma

1
sed -ne 'y/:/\n/;P' file.txtcũng có thể được sử dụng.
Rakesh Sharma

Make .+đến.*
Rakesh Sharma

@Randy Joselyn Kể từ khi có một tiềm ẩn iftrong s///pcú pháp, bạn cần phải sửa đổi regex của bạn để chăm sóc các dòng không có dấu hai chấm, một cái gì đó giống như, sed -nEe 's/([^:]*)(:.*|)/\1/p'. Lưu ý điều này đòi hỏi GNU sednhưng vì dù sao bạn cũng đang dùng GNU sed nên điều này không thành vấn đề.
Rakesh Sharma

Câu trả lời này có thể là yêu thích của tôi, nhưng ERE là không cần thiết. sed -n '/:/s/^\([^:]*\):.*$/\1/p(thêm --posixnếu bạn sử dụng GNU sed, chỉ để kích thích tính mở rộng của chúng)
mirabilos

4

Yêu cầu GNU grep. Nó sẽ không hoạt động với grep mặc định trên, ví dụ như macOS hoặc bất kỳ BSD nào khác.

Bạn có nghĩa là như thế này:

grep -oP '.*(?=:)' file

Đầu ra:

help.helloworld.com
dev.helloworld.com

4
Nếu có hai hoặc nhiều dấu hai chấm trên dòng, điều này sẽ in mọi thứ cho đến cái cuối cùng, vì vậy không phải là những gì OP cần. Hãy thử echo foo:bar:baz | grep -oP '.*(?=:)'. Điều này sẽ làm việc cho ví dụ của OP, nhưng không phải cho trường hợp chung như được mô tả trong câu hỏi.
terdon

chỉ có một dấu hai chấm và nó hoạt động tốt, nhưng cảm ơn vì đã cập nhật
Gabrial Johnas

-1

Bạn có thể đạt được điều này với việc xử lý chuỗi bash, bằng cách loại bỏ kết quả khớp dài nhất khỏi chuỗi trực tiếp cho mỗi dòng được đọc như sau:

for line in $(cat inputfile); do echo "${line%%:*}"; done

Đây có thể là một sự thay thế hữu ích nếu bạn phân tích tệp trong tập lệnh shell (mặc dù tôi nghi ngờ sử dụng cắt có thể hiệu quả hơn).



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.