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!
Nguồn
2014-03-07 22:07:54
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 đó? –
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
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. –