Làm cách nào để xóa phần còn lại của mỗi dòng sau một mẫu nhất định hoặc một chuỗi trong một tệp?


21

Giả sử tôi có một danh sách các URL trong tệp văn bản:

google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

Tôi muốn xóa mọi thứ xuất hiện sau '.com'.

Kết quả dự kiến:

google.com
unix.stackexchange.com
isuckatunix.com

Tôi đã thử

sed 's/.com*//' file.txt 

nhưng nó xóa .comlà tốt.


Có một lý do cụ thể mà bạn muốn tìm kiếm .comchỉ thay vì loại bỏ mọi thứ sau và bao gồm cả /ký tự đầu tiên ? Điều gì nếu bạn có một URL như en.wikipedia.org/wiki/Ubuntutrong danh sách của bạn?
Chỉ huy Byte

Câu trả lời:


17

Để xóa rõ ràng mọi thứ xuất hiện sau ".com", chỉ cần điều chỉnh giải pháp sed hiện tại của bạn để thay thế ".com (bất cứ thứ gì)" bằng ".com":

sed 's/\.com.*/.com/' file.txt

Tôi đã điều chỉnh regex của bạn để thoát khỏi giai đoạn đầu tiên; nếu không, nó sẽ khớp với thứ gì đó như "thisiscommon.com/s Something".

Lưu ý rằng bạn có thể muốn neo thêm mẫu ".com" bằng dấu gạch chéo phía trước để bạn không vô tình cắt một cái gì đó như "sub.com.domain.com/foo":

sed 's/\.com\/.*/.com/' file.txt

9

Bạn có thể sử dụng awkdấu tách trường ( -F) theo cách sau:

$ cat file
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

$ cat file | awk -F '\\.com' '{print $1".com"}'
google.com
unix.stackexchange.com
isuckatunix.com

Giải trình:

NAME
       awk - pattern scanning and processing language

-F fs
       --field-separator fs
              Use fs for the input field separator (the value of the FS predefined variable).

Khi bạn muốn xóa mọi thứ sau đó .com, hãy -F '.com'tách dòng .comvà chỉ print $1cung cấp đầu ra cho phần trước .com. Vì vậy, $1".com"thêm .comvà cung cấp cho bạn đầu ra mong đợi.


Tại sao không chỉ /là FS và lấy trường đầu tiên?
heemayl


1
@Pandya: Điều này thất bại với chuỗi nhưacomercial.com/asdsad
cuonglm

@cuonglm Cảm ơn bạn đã chỉ ra. Câu trả lời được cải thiện
Pandya

4

Công cụ tốt nhất để chỉnh sửa tập tin tại chỗ không tương tác là ex.

ex -sc '%s/\(\.com\).*/\1/ | x' file.txt

Nếu bạn đã sử dụng vivà nếu bạn đã từng gõ một lệnh bắt đầu bằng dấu hai chấm, :bạn đã sử dụng lệnh ex. Tất nhiên, nhiều lệnh nâng cao hoặc "ưa thích" hơn mà bạn có thể thực hiện theo cách này là các tiện ích mở rộng Vim (ví dụ :bufdo) và không được xác định trong thông số kỹ thuật POSIXex , nhưng các thông số kỹ thuật đó cho phép mức độ đáng kinh ngạc và linh hoạt trong khả năng phi thị giác chỉnh sửa văn bản (cho dù tương tác hay tự động).

Lệnh trên có một số phần.

-scho phép chế độ im lặng để chuẩn bị exsử dụng hàng loạt. (Bỏ thông điệp đầu ra et. Al.)

-cchỉ định lệnh để thực thi khi tệp ( file.txttrong trường hợp này) được mở trong bộ đệm.

%là một công cụ xác định địa chỉ tương đương 1,$vớiMitit có nghĩa là lệnh sau được áp dụng cho tất cả các dòng của bộ đệm.

slà lệnh thay thế mà bạn có thể đã quen thuộc với. Nó thường được sử dụng trong vivà có các tính năng cơ bản giống hệt với slệnh củased , mặc dù một số tính năng regex nâng cao có thể thay đổi khi thực hiện. Trong trường hợp này, từ ".com" đến cuối dòng được thay thế bằng ".com".

Thanh dọc ngăn cách các lệnh tuần tự được thực hiện. Trong nhiều (hầu hết) extriển khai, bạn cũng có thể sử dụng một -ctùy chọn bổ sung , như vậy:

ex -sc '%s/\(\.com\).*/\1/' -c x file.txt

Tuy nhiên, điều này không bắt buộc bởi POSIX.

Các xlối ra lệnh, sau khi viết bất kỳ thay đổi đối với tập tin. Không giống như wqcó nghĩa là "ghi và thoát", xchỉ ghi vào tệp nếu bộ đệm đã được chỉnh sửa. Do đó, nếu tệp của bạn không được thay đổi, dấu thời gian sẽ được giữ nguyên.


1
+1 khi sử dụng ex
Jeff Schaller

1
Nó không chỉnh sửa tại chỗ. Ít nhất, nó không hơn bất kỳ điều gì sedkhông có thật của Gnu . Nó đọc / ghi vào bộ đệm trên đĩa. Xem cho chính mình w / ex -rpreservelệnh.
mikeerv

@mikeerv preserveLệnh nào?
Mateen Ulhaq

2

Cách trăn rất nhanh, đơn giản và bẩn:

#!/usr/bin/env python
import sys
with open( sys.argv[1]  ) as file:
    for line in file:
        print line.split("/")[0]

Chạy mẫu

skolodya@ubuntu:$ chmod +x removeStrings.py                                   

skolodya@ubuntu:$ ./removeStrings.py strings.txt                              
google.com
unix.stackexchange.com
isuckatunix.com


skolodya@ubuntu:$ cat strings.txt                                             
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

2
Tôi có thể biết lý do cho downvote?
Sergiy Kolodyazhnyy

3
Nó hoạt động, nhưng nó không quan tâm .com, nó chỉ loại bỏ mọi thứ bắt đầu với dòng đầu tiên /. (theo ý kiến ​​của tôi, ngay cả cách tiếp cận tốt hơn!)
Chỉ huy Byte

1
@ByteCommander chính xác! Nếu tên miền là .net, trong các cách tiếp cận khác, phần đi sau tên miền và tiện ích mở rộng sẽ không bị xóa, vì vậy an toàn hơn khi sử dụng /làm dấu phân cách.
Sergiy Kolodyazhnyy

+1 cho câu trả lời và nhận xét khiến tôi cảm thấy như mình đang ở AskUb Ubuntu.com: D
WinEunuuchs2Unix
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.