Làm thế nào để khớp các chữ số theo sau bởi một dấu chấm bằng cách sử dụng sed?


76

Tôi đang cố gắng sử dụng sedđể thay thế tất cả các mẫu bằng các chữ số được theo sau bởi một dấu chấm (chẳng hạn như 3., 355.) bằng một chuỗi trống. Vì vậy, tôi cố gắng:

sed 's/\d+\.//g' file.txt

Nhưng nó không hoạt động. Tại sao vậy?


1
Tôi thấy bài viết này rất hữu ích
Stphane 8/2/2015

Câu trả lời:


111

Bởi vì sed không phải là perl - sed regexes không có tốc \dký:

sed 's/[[:digit:]]\+\.//g'

sed tài liệu biểu hiện thường xuyên ở đây .


3
Đó là nếu bạn muốn không hoặc nhiều chữ số. /[[:digit:]]*\. /sẽ khớp với chuỗi foo.vì bạn cho phép các chữ số 0. Nếu bạn muốn một hoặc nhiều sử dụng \+như được hiển thị
glenn jackman

71

Hai vấn đề:

  1. sedkhông hỗ trợ \d. Sử dụng [0-9]hoặc [[:digit:]].

  2. +phải được gạch chéo lại để có được ý nghĩa đặc biệt : \+.


6
thay vì gạch chéo ngược + (chẳng hạn như không hoạt động trên Mac OS X), bạn có thể sử dụng tùy chọn -E để interpret regular expressions as extended (modern) regular expressions rather than basic regular expressions (BRE's).Đáng buồn, điều này không giúp ích gì cho vấn đề \ d ...
gMale

4
@gmale: -Ekhông hoạt động cho GNU sed, nó sử dụng -rthay thế.
choroba

12
Được rồi ... có vẻ như sedchỉ là hút khi nói đến tính di động ...
iconoclast

@choroba Tôi nghĩ hôm nay tôi bối rối. Tôi sẽ xóa những bình luận ồn ào của mình ...
Steven Lu

Về cơ bản, điều tôi đã cố gắng để cảnh báo mọi người là: Nếu bạn không sử dụng regex mở rộng ( -Etrên BSD sed và -rtrên GNU sed), trong BSD sed, thì +cũng không \+(cùng với ?) sẽ hoạt động, trong khi trong GNU sed bạn có thể làm cho họ làm việc với dấu gạch chéo ngược. Do đó, khuyến nghị chung là sử dụng regex mở rộng trong kịch bản
Steven Lu

3

Trang sed man tham khảo trang man re_format. Nó làm cho 2 sự khác biệt: (1) lỗi thời so với biểu thức chính quy mở rộng; (2) biểu thức chính quy không tăng cường so với tăng cường. Tất cả 4 kết hợp đều có thể. Có hỗ trợ trong sed cho cả lỗi thời và mở rộng, nhưng trong cả hai trường hợp chỉ dành cho không tăng cường. Toán tử \ d là một tính năng của các biểu thức chính quy nâng cao, do đó không được sed hỗ trợ.

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.