2009-08-04 13 views
25

Bây giờ theo tất cả các tài liệused trên OS X - dường như không thể sử dụng + trong regexps

echo 1234abcd|sed "s|[0-9]\+|#|g" 

nên sản lượng #abcd. Và

echo abcd|sed "s|[0-9]\+|#|g" 

nên xuất abcd.

Nhưng trên OS X 10.4.11 biểu thức đầu tiên đầu ra 1234abcd. Sử dụng * thay vì + làm việc cho ví dụ đầu tiên nhưng không thành công trên trang thứ hai, xuất #abcd, vì mẫu [0-9] được so khớp 0 lần.

Nhà điều hành + có hoạt động không trong biểu thức chính quy trong OS X không? Có cách nào khác không?

Cảm ơn

+0

sed không 'trở abcd'. Nó trả về 0, và nó xuất ra "abcd". Đầu ra của một chương trình là * không * giá trị trả về của nó. –

+0

Bạn rất đúng ạ. Bây giờ tôi sửa lỗi. – stib

Trả lời

48

Trên OSX, sed theo mặc định sử dụng RE cơ bản. Bạn nên sử dụng sed -E nếu bạn muốn sử dụng RE hiện đại, bao gồm "+" một hoặc nhiều toán tử.

Xem here cho dấu hiệu cho thấy sed sử dụng REs cơ bản theo mặc định, here cho cú pháp RE hiện đại, và here cho RE cơ bản (ed) thông tin.


Ngoài ra, nếu bạn có một động cơ biểu thức chính quy mà không hỗ trợ + ở tất cả, bạn có thể chỉ cần sử dụng * thay vào đó, bằng cách chuyển đổi (ví dụ):

[a-z]+ 

thành:

[a-z][a-z]* 
+2

Câu trả lời này là chính xác về mặt kỹ thuật, tuy nhiên tôi đã liên tục thất vọng bởi cờ -E vì nó không thể di chuyển đến bất kỳ phiên bản nào của sed thường được bao gồm trong bản phân phối Linux. Emptor caveat. –

+0

@JayTaylor Tôi mới đến đây vì regex của tôi không hoạt động đúng trên Ubuntu Lucid và chỉ định '-E' đã giải quyết được vấn đề. – AndreKR

+0

@AndreKR Cờ '-E' sẽ hoạt động bất cứ khi nào bạn đang sử dụng phương ngữ mở rộng của regex. Tôi ước tôi có thể giúp đỡ nhiều hơn và không có thêm chi tiết, không có gì khác tôi có thể nói! –

8

Obsolete biểu thức thông thường cơ bản không hỗ trợ +? quantifiers. Chúng là các ký tự thông thường.

Các lựa chọn thay thế cho [0-9]+ là ví dụ: [0-9]{1,} hoặc [0-9][0-9]*.

Hoặc bạn có thể sử dụng sed -E để sử dụng cụm từ thông dụng hiện đại, mở rộng.

1

bạn có thể sử dụng awk

# echo 1234abcd| awk '{gsub(/[0-9]+/,"#")}1' 
#abcd 

# echo abcd| awk '{gsub(/[0-9]+/,"#")}1' 
abcd 
+0

Tôi đoán tôi sẽ phải học tiếp theo. Mặc dù vậy, tôi vẫn đang bị mê hoặc. – stib

+2

sẽ không ngăn cản bạn học sed, nhưng một khi bạn biết awk trong và ngoài, không cần phải sử dụng sed nữa. – ghostdog74

1

Nhiều tiện ích Unix X của phiên bản thiếu các tiện ích tương đương GNU của chúng. Như Pax nói, bạn có thể sử dụng -E:

[email protected] drigz 0$ echo 1234abcd | /usr/bin/sed "s/[0-9]\+/#/g" 
1234abcd 
[email protected] drigz 0$ echo 1234abcd | /usr/bin/sed -E "s/[0-9]+/#/g" 
#abcd 

Lưu ý rằng các thay đổi nhỏ về cú pháp của regex được yêu cầu (\ + đến + trong trường hợp này).

Tuy nhiên, tôi thích sử dụng Fink để có được các tiện ích GNU:

[email protected] drigz 0$ echo 1234abcd | /sw/bin/sed "s/[0-9]\+/#/g" 
#abcd 
[email protected] drigz 0$ /sw/bin/sed --version 
GNU sed version 4.1.5 
Copyright (C) 2003 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, 
to the extent permitted by law. 
+0

Tôi giả định rằng bạn có nghĩa là \\ + đến + (định dạng dường như đã ăn nhân vật thoát) Thật không may là tường lửa ở nơi này dường như chặn fink và macports, vì vậy có rất nhiều điều thú vị mà tôi có thể không truy cập. – stib

+0

hmm .. đôi khi nó ăn \ đôi khi không phải – stib

+0

Có - bạn nói đúng. Bạn có thể cài đặt chúng theo cách cũ không? (./configure && make && sudo make install) –

2

Nếu + không làm việc, bạn luôn có thể sử dụng {1,}

+0

Ồ, tôi hiểu rồi, dĩ nhiên. Cảm ơn. – stib