2011-04-11 24 views
8

Làm cách nào để bao gồm kết hợp regex trong biểu thức thay thế bằng BASH?Cách tham chiếu hình chụp trong thay thế bash regex

không làm việc Ví dụ:

#!/bin/bash 
name=joshua 
echo ${name//[oa]/X\1} 

tôi mong đợi để ra jXoshuXa với \1 được thay thế bằng các nhân vật phù hợp.

Điều này không thực sự hoạt động mặc dù và đầu ra jX1shuX1 thay thế.

+2

Tôi không thấy bất kỳ điều gì trong phiên bản bash của tôi (4.1.5) về việc có thể thực hiện thay thế regex bằng cách sử dụng cú pháp '$ {foo/bar/baz}'. Bạn có bất kỳ tài liệu tham khảo cho lý do tại sao bạn nghĩ rằng bạn sẽ có thể làm điều đó? –

+0

Tôi không chắc chắn nơi tôi tình cờ gặp nó nhưng nó hoạt động. Sử dụng ví dụ trên, bạn có thể thấy rằng nó đang thay thế 'o' và' a' bằng 'X'. Khá trơn. – joshuapoehls

+0

Xem http://tldp.org/LDP/abs/html/parameter-substitution.html, mô tả về điều này là khoảng 3/4 cách xuống trang. –

Trả lời

7
bash> name=joshua 
bash> echo $name | sed 's/\([oa]\)/X\1/g' 
jXoshuXa 
+0

Nếu bạn định tiếp cận sed, điều này đơn giản hơn: 's/[oa]/X &/g' –

+0

Cảm ơn! Tôi đã hy vọng để có thể làm điều đó mà không gọi là 'sed' nhưng điều này cũng làm việc tốt. – joshuapoehls

22

Có lẽ không trực quan và rõ ràng là tất cả địa ngục nhưng trong tinh thần hoàn chỉnh, trong khi chúng tôi chờ BASH chụp thay thế cho đến, sau đây là hiện tại có thể.

#!/bin/bash 
name='joshua' 
[[ $name =~ ([ao].*)([oa]) ]] && \ 
    echo ${name/$BASH_REMATCH/X${BASH_REMATCH[1]}X${BASH_REMATCH[2]}} 

Trong ví dụ đó, chúng tôi biết những gì chúng tôi đang tìm kiếm. Gần hơn đối sánh với tất cả các đối tác regex toàn cầu, ví dụ sau sẽ tham lam khớp với lần xuất hiện cuối cùng của tập hợp mà không có tiền tố X và tiếp tục lùi cho đến khi không còn giá trị nào.

#/bin/bash 
name='joshua' 
while [[ $name =~ .*[^X]([oa]) ]]; do 
    name=${name/$BASH_REMATCH/${BASH_REMATCH:0:-1}X${BASH_REMATCH[1]}} 
done 
echo $name 

Đó dụ sẽ làm việc tương tự như giao diện đằng sau biểu hiện /(?<!X)([oa])/X\1/ giả định để chỉ quan tâm đến các o và một nhân vật mà không có một X tiền tố.

đầu ra cho cả hai ví dụ

jXoshuXa 

NJOY!

Các vấn đề liên quan