2011-04-11 16 views
8

BASH ifadesinde ifade ifadesinde normal ifadeyi nasıl ekleyebilirim?Bash regex değiĢtirmesindeki yakalamalara başvurma

Sigara çalışma örneği:

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

Ben eşleşti karakteri yerini \1 ile çıkışa jXoshuXa bekliyoruz.

Bu, aslında çalışmıyor ve çıktılar jX1shuX1. Biz gelmesi yerine yakalayabilir BASH beklerken Belki olarak sezgisel olmayan ve tüm cehennem gibi ancak bütünlük ruhu içinde tartışmasız belirsiz

+2

"$ {foo/bar/baz}" sözdizimini kullanarak normal ifadeleri kullanabilme konusunda bash (4.1.5) sürümümde hiçbir şey göremiyorum. Bunu yapabilmeniz için neden düşündüğünüze dair herhangi bir referansınız var mı? –

+0

Nerede rastladığımdan emin değilim ama işe yarıyor. Yukarıdaki örneğimi kullanarak 'o' ve 'a'nın bir' X 'ile değiştirildiğini görebilirsiniz. Oldukça kaygan. – joshuapoehls

+0

http://tldp.org/LDP/abs/html/parameter-substitution.html adresine bakın, bunun açıklaması sayfanın aşağısına yaklaşık 3/4'dür. –

cevap

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

Eğer sed için ulaşacaksanız, bu daha basit: 's/[oa]/X &/g' –

+0

Teşekkürler! Ben 'sed' demeden yapabilmeyi umuyordum ama bu da iyi çalışmalı. – joshuapoehls

22

, aşağıdaki şu anda mümkündür.

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

Bu örnekte aradığımızı biliyoruz. Maçın tamamına veya global regex karşılıklarına daha yakın olan aşağıdaki örnek, önek X olmadan koleksiyonun son oluşumuna açgözlü bir eşleşme yapar ve geriye kalana kadar geriye doğru devam eder. örnek sadece o ve öneki bir X olmayan bir karakterler hakkında bakım varsayar ifade /(?<!X)([oa])/X\1/ arkasında görünüme benzer çalışacaktır 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 

. Her iki örnekte

jXoshuXa 

NJoy için

çıktı!