2009-03-27 50 views
20

Tôi muốn thay đổi các mẫu sau:thượng hạ hợp cụ thể bằng cách sử dụng sed

getFoo_Bar 

tới:

getFoo_bar 

(lưu ý các b thấp hơn)

Biết không foo cũng không phải thanh, mẫu thay thế là gì?

tôi bắt đầu viết

sed 's/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1 

nhưng tôi bị mắc kẹt: Tôi muốn viết "\ 2 thấp hơn trường hợp", làm thế nào để làm điều đó?

Có lẽ sed không được điều chỉnh?

Trả lời

24
s/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1\L\2/g 

Test:

$ echo 'getFoo_Bar' | sed -e 's/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1\L\2/g' 
getFoo_bar 
+1

Để mở rộng câu trả lời, đây là biểu thức chung để chuyển sang chữ thường, tất cả các ký tự: 'echo getFoo_Bar | sed -e 's/\ ([A-Z] [A-Za-z0-9] * \)/\ L \ 1/g'', tạo ra 'getfoo_bar' – espinchi

+7

Lưu ý rằng giải pháp này chỉ hoạt động với GNU sed. Không có '\ l' /' \ L'/'\ u' /' \ U'/'\ E' trong POSIX sed. Trong trường hợp này bạn có thể sử dụng perl (xem câu trả lời của [@ ​​user83591 cho câu hỏi này] (http://stackoverflow.com/a/689620/2451238)) hoặc awk (xem [câu trả lời của tôi cho một câu hỏi khác] (http: // stackoverflow .com/a/18298882/2451238)). – mschilli

1

Bạn có thể sử dụng perl cho một này:

perl -pe 's/(get[A-Z][A-Za-z0-9]*)_([A-Z])/\1_\l\2/' 

Các \ l là thủ thuật ở đây.

sed không thực hiện trên/chữ thường trên các nhóm phù hợp.

7

Hơi ngắn:

echo getFoo_Bar | sed 's/_\(.\)/_\L\1/' 
+0

Làm thế nào về '\ s/\ (_. \)/\ L \ 1 /'? – Beta

+0

ngọt ngào! nhìn mọi nơi như thế này +1 –

33

Để thay đổi getFoo_Bar để getFoo_bar sử dụng sed:

echo "getFoo_Bar" | sed 's/^\(.\{7\}\)\(.\)\(.*\)$/\1\l\2\3/' 

Các chữ hoa và chữ thường được xử lý bởi:

  • \U Làm cho tất cả các văn bản đến chữ hoa phải.
  • \u chỉ tạo ký tự đầu tiên cho chữ hoa bên phải.
  • \L Chuyển tất cả văn bản sang chữ thường bên phải.
  • \l Chỉ tạo ký tự đầu tiên cho chữ thường thấp hơn. (Lưu ý chữ thường L)

Ví dụ chỉ là một phương pháp để khớp mẫu, chỉ dựa trên sửa đổi một đoạn văn bản. Sử dụng ví dụ, các biến đổi getFoo_BAr thành getFoo_bAr, lưu ý rằng A không bị thay đổi.

+1

Có cách nào để khiến mọi thứ trở lại bình thường sau khi lệnh \ L không? – Benjamin

+4

Từ http://www.gnu.org/software/sed/manual/sed.html: '\ E' _Stop chuyển đổi trường hợp được bắt đầu bởi_' \ L' _or_ '\ U'. –

+2

Đây là một câu trả lời tuyệt vời vượt xa câu hỏi ban đầu. Nó cung cấp thông tin tham khảo về xử lý tất cả các loại nhiệm vụ chuyển đổi trường hợp trong sed. Đã tiết kiệm cho tôi rất nhiều thời gian nghiên cứu. Cảm ơn bạn! – rustyx

5

Shortest tôi có thể đưa ra:

echo getFoo_Bar | sed 's/_./\L&/' 
+1

'**' làm gì? – potong

-2
echo getFoo_Bar | sed 's/[Bb]/\L&/g' 
+0

Bạn đã bỏ lỡ điểm. Bạn đang thực hiện tìm kiếm toàn cầu/thay thế tại đây, không phải là tìm kiếm/thay thế ở dưới đây. –

0

Nếu bạn muốn viết tất cả mọi thứ trong chữ thường ngay sau dấu gạch dưới, hơn thế này sẽ làm việc cho bạn:

echo getFoo_Bar | gawk -F_ '{print tolower($2)}' 
Các vấn đề liên quan