grep - xóa văn bản sau mã thông báo dấu phân cách


12

Tôi có một tệp trong đó tôi cần loại bỏ mọi thứ sau lần đầu tiên ;trên mỗi dòng.

Vì vậy, một tập tin như thế này:

sdfsdsdf;
fsdfsddf;sdfsd;

Sẽ dẫn đến điều này:

sdfsdsdf
fsdfsddf

Tôi đã xem xét grepsed. Tôi sẽ đánh giá cao một câu trả lời kết hợp một trong hai lệnh này.

Câu trả lời:


5

sed có lẽ dễ nhất và nhanh hơn awk hoặc perl trong trường hợp này:

sed 's/^\([^;][^;]*\);.*$/\1/' some_file_name

6
Điều này phức tạp hơn nó nên được! sed 's/;.*//'
Gilles 'SO- ngừng trở nên xấu xa'

Tôi có ý kiến ​​khác. perl -pe 's /;.*//' some_file_name cũng dễ như vậy, và nhanh hơn tới 1500% khi hoạt động trong các tệp lớn.

Tôi có một số hệ thống có sẵn sed nhưng perl thì không, vì vậy tôi khuyến khích sử dụng các giải pháp trọng lượng nhẹ hơn khi chúng đủ.
dubiousjim

7

tùy chọn khác là sử dụng cutlệnh

cat a.file | cut -d';' -f1

9
mèo vô dụng

3

Tôi thường sử dụng awkcho những thứ như thế này:

cat a.file | awk -F=";" '{ print $1 }'

Điều đó sẽ lấy từng dòng của một tệp và in nhóm đầu tiên trước dấu phân cách -F


7
sử dụng vô dụng của cat.
Tạm dừng cho đến khi có thông báo mới.

1
Dennis thứ hai đấy. Và theo linux và BSD mà -F = ";" không hoạt động như dự định. Và bạn cũng có thể muốn trích dẫn $ 1 đó: awk -F ";" '{in $ 1}' a.file

2

Đây là một cách để làm điều đó bằng GNU grep:

grep -Po "^[^;]+(?=;?)" filename

Không có Gnu grep: grep -Eo '^[^;]+;' filenamegần như có được nó, nó chỉ in quá một ký tự. grep -Eo '^[^;]+' filenamehầu như cũng nhận được nó, nhưng nó cũng sẽ in các dòng hoàn chỉnh (không trống) mà không có ;.
dubiousjim
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.