2013-08-18 52 views
7

Tôi đang cố gắng lấy hai chữ cái cuối cùng ra khỏi tên tệp có chữ hoa và nối chúng vào tên tệp theo chữ thường. Tôi expeceted lệnh:Sự khác biệt giữa sed và Mac OS X với các trình tự điều khiển chụp trên, dưới và toàn bộ

ls | sed -e "s/.*\([A-Z][A-Z]\)$/\0\/\L\1\E/" 

để đạt được điều này và trên hộp Ubuntu của tôi nó làm việc tốt nhưng trên máy Mac của tôi nó chỉ đơn giản in ra một 0/LXXE/ nơi XX là các chữ cái đúng từ chụp.

Tương đương Mac tương đương với \0, \L\E là gì?

Tôi đã có một cái nhìn xung quanh trang web và một số người đã nhận thấy rằng Mac OS X sed khác với Ubuntu sed nhưng hầu hết các chủ đề nói về yêu cầu -i cho một phần mở rộng tập tin hoặc chuỗi rỗng (trước đây đã vấp tôi lên).

Trả lời

18

OSX sed là phiên bản cũ và không hỗ trợ chức năng \L, \E, vv Cài đặt gnu sed trên Mac sử dụng:

brew install gnu-sed 
+7

'brew cài đặt --default- tên gnu-sed' để cài đặt dưới dạng 'sed' thay vì' gsed' – TalkLittle

+1

"Chạy Homebrew làm gốc cực kỳ nguy hiểm và không còn được hỗ trợ nữa." – arekolek

+1

Cảm ơn @arekolek, đó là một điểm rất tốt. Tôi đã chỉnh sửa. – anubhava

6

awk thay thế:

ls | awk '{print $0 tolower(substr($0,length($0)-1,2))}' 
+0

Dường như không hoạt động theo yêu cầu (ít nhất là trên OS X) - hai ký tự cuối cùng được lặp lại. –

+1

@PaulR: Theo như tôi hiểu, đó là những gì OP muốn: '* ... lấy hai chữ cái cuối cùng [...] và nối thêm chúng ... *'. Nếu bạn muốn * thay thế * hai ký tự cuối cùng bằng các phiên bản chữ thường của chúng, hãy thử: 'ls | awk '{print substr ($ 0,1, length ($ 0) -2) tolower (substr ($ 0, length ($ 0) -1,2))}' ' – mschilli