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?
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?
Câu trả lời:
Bởi vì sed không phải là perl - sed regexes không có tốc \d
ký:
sed 's/[[:digit:]]\+\.//g'
sed tài liệu biểu hiện thường xuyên ở đây .
/[[: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ị
Hai vấn đề:
sed
không hỗ trợ \d
. Sử dụng [0-9]
hoặc [[:digit:]]
.
+
phải được gạch chéo lại để có được ý nghĩa đặc biệt : \+
.
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 ...
-E
không hoạt động cho GNU sed, nó sử dụng -r
thay thế.
sed
chỉ là hút khi nói đến tính di động ...
-E
trên BSD sed và -r
trê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
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ợ.