2011-08-06 42 views
6

Tôi đang in một tập lệnh shell và có một biến như sau: something-that-is-hyphenated.vỏ tiêu đề vỏ linux

tôi cần phải sử dụng nó trong các điểm khác nhau trong kịch bản như:

something-that-is-hyphenated, somethingthatishyphenated, SomethingThatIsHyphenated

Tôi đã cố gắng thay đổi nó để somethingthatishyphenated bằng cách tách ra - sử dụng sed "s/-//g".

Tôi chắc chắn có một cách đơn giản hơn và cũng cần biết cách lấy phiên bản vỏ lạc đà.

Chỉnh sửa: chức năng làm việc bắt nguồn từ @ câu trả lời Michał của

function hyphenToCamel { 
    tr '-' '\n' | awk '{printf "%s%s", toupper(substr($0,1,1)), substr($0,2)}' 
} 

CAMEL=$(echo something-that-is-hyphenated | hyphenToCamel) 
echo $CAMEL 

Edit: Cuối cùng, một sed lót nhờ @glenn

echo a-hyphenated-string | sed -E "s/(^|-)([a-z])/\u\2/g" 
+0

Hãy xem xét điều này - http://www.linuxpronews.com/linuxpronews-55-20110315ShellScriptToConvertLowercaseToTitleCase.html – arunkumar

+0

Có lý do nào khiến bạn không thể sử dụng cùng tên biến không? Bạn đang thêm rất nhiều sự phức tạp không cần thiết cho kịch bản của mình. –

+0

Tôi đang xây dựng các tệp dự án titan và cần sử dụng tên dự án của tôi làm tên ứng dụng và thư mục dự án, nhưng com.domain.myprojectname làm id ứng dụng và sau đó là com.domain.myprojectname/.MyProjectNameActivity để khởi động nó vỏ adb trên thiết bị Android. –

Trả lời

4

một GNU sed one-liner

echo something-that-is-hyphenated | 
sed -e 's/-\([a-z]\)/\u\1/g' -e 's/^[a-z]/\u&/' 

\u trong chuỗi thay thế được ghi chép lại trong the sed manual.

+0

Hoặc đơn giản là 'echo a-hyphenated-string | sed -E "s/(^ | -) ([a-z])/\ u \ 2/g" '. Công cụ tuyệt vời. Tôi không thể tìm thấy tính năng đó được ghi trong 'man sed'. Cảm ơn - đây chính xác là những gì tôi đang tìm kiếm. –

+3

mặc dù cả hai đều không hoạt động trên vỏ OSX –

0

Trong vỏ bạn đang bị mắc kẹt với việc lộn xộn:

 
    aa="aaa-aaa-bbb-bbb" 
    echo " $aa" | sed -e 's/--*/ /g' -e 's/ a/A/g' -e 's/ b/B/g' ... -e 's/ *//g' 

Lưu ý không gian được đặt cẩn thận trong tiếng vọng và khoảng trống trong cuối cùng -e.

Tôi để nó như một bài tập để hoàn thành mã.

Trong perl nó là một chút dễ dàng hơn như một lệnh shell một dòng:

 
perl -e 'print map{ $a = ucfirst; $a =~ s/ +//g; $a} split(/-+/, $ARGV[0]), "\n"' $aa 
+0

Nếu bạn đang ở trong bash, cũng lưu ý '$ {var // string/replacement}'. Bạn thậm chí có thể mã chuyển đổi CamelCase trong Bash thuần túy, mặc dù nó sẽ hơi tẻ nhạt. – tripleee

+0

Đã học thêm một chút hôm nay. – Gilbert

1

Bạn có thể định nghĩa một hàm:

hypenToCamel() { 
    tr '-' '\n' | awk '{printf "%s%s", toupper(substr($0,0,1)), substr($0,2)}' 
} 

CAMEL=$(echo something-that-is-hyphenated | hypenToCamel) 
echo $CAMEL 
+0

không hoàn toàn hoạt động - nhưng đã làm việc với một số chỉnh sửa (thêm vào câu hỏi của tôi bây giờ) –

+0

chỉ là 'substr' trong' toupper' cần phải là 'substr ($ 0,1,1)' –

4

tinh khiết bashism:

var0=something-that-is-hyphenated 
var1=(${var0//-/ }) 
var2=${var1[*]^} 
var3=${var2// /} 
echo $var3 
SomethingThatIsHyphenated 

Dòng 1 là tầm thường.
Dòng 2 là bashism để thay thếTất cả hoặc 's/-/ /g', được bao bọc trong các ngăn xếp, để tạo một mảng.
Dòng 3 sử dụng ${foo^}, có nghĩa là chữ hoa (trong khi ${foo,} có nghĩa là 'thường' [lưu ý, làm thế nào ^ điểm lên trong khi , điểm xuống]) nhưng để hoạt động trên tất cả các chữ cái đầu tiên của một từ, chúng ta giải quyết toàn bộ mảng với ${foo[*]} (hoặc ${foo[@]}, nếu bạn thích điều đó).
Dòng 4 lại là một thay thế toàn bộ: trống không có gì.
Dòng 5 là không đáng kể một lần nữa.

+0

Gọn gàng! Vay (với các điều chỉnh) [ở đây] (http://stackoverflow.com/a/28344598/874188) – tripleee

+0

Đẹp nhưng điều này thiếu một số dấu ngoặc kép lành mạnh (và do đó phải chịu sự mở rộng tên đường dẫn). Thay vào đó tôi sẽ đề nghị: 'var0 = something-that-is-hyphenated; IFS = - đọc-r -d '' -a var1 <<(printf '% s \ 0' "$ {var0 ,,}"); printf '% s \ n' "$ {var1 [@] ^}" '. –

+0

@gniourf_gniourf: Bạn có thể cụ thể hơn khi cần báo giá và cách nó có thể phụ thuộc vào việc mở rộng tên đường dẫn, có thể là một ví dụ? Và bạn không cần phải thiết lập lại IFS sau đó? –

0

Đối với các hồ sơ, đây là một Bash tinh khiết an toàn phương pháp (mà không phải là đối tượng để mở rộng tên đường dẫn) • nhập Bash≥4:

var0=something-that-is-hyphenated 
IFS=- read -r -d '' -a var1 < <(printf '%s\0' "${var0,,}") 
printf '%s' "${var1[@]^}" 

này (an toàn) chia tách việc mở rộng thường của var0 tại dấu gạch nối, với mỗi phần tách trong mảng var1. Sau đó, chúng tôi sử dụng mở rộng tham số ^ để viết hoa ký tự đầu tiên của các trường của mảng này và nối chúng.

Nếu biến của bạn cũng có thể chứa dấu cách và bạn cũng muốn hành động trên chúng, hãy thay đổi IFS=- thành IFS='- '.