2011-04-11 15 views
8

BASHの置換式に正規表現を含めるにはどうすればよいですか?bash regexの置き換えでキャプチャを参照する方法

非作業例:

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

私はマッチした文字に置き換えられて\1で出力jXoshuXaに期待しています。

これは実際には機能しませんが、代わりにjX1shuX1を出力します。おそらく、

+2

私のバージョンのbash(4.1.5)では、 '$ {foo/bar/baz}'構文を使って正規表現の置換を行うことができません。なぜあなたはあなたがそれを行うことができるはずだと思うかについての参考文献がありますか? –

+0

私はどこに遭遇したのか分かりませんが、うまくいきます。上記の例を使用すると、 'o'と' a'を 'X'に置き換えていることがわかります。かなり滑らか。 – joshuapoehls

+0

http://tldp.org/LDP/abs/html/parameter-substitution.htmlを参照してください。これについての説明は、ページの3/4ほどです。 –

答えて

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

sedを手に入れようとするなら、これは簡単です: 's/[oa]/X&/ g' –

+0

ありがとう!私は 'sed'を呼ぶことなくそれをやることができるようにしたいと考えていましたが、これはちょうどうまくいくはずです。 – joshuapoehls

22

ないように直感的で、すべての地獄のように、間違いなくあいまいなしかし完全の精神で、BASHが到着する置き換えるで捉えるために、我々は待っている間、以下が現在可能です。

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

この例では、私たちが探しているものを知っています。次の例は、プレフィックスXを持たないコレクションの最後のオカレンスに貪欲に一致し、何も残らないまで後方に続きます。

例のみOとXが前に置かれていない文字を気に想定して表現 /(?<!X)([oa])/X\1/の後ろを見に似て動作します
#/bin/bash 
name='joshua' 
while [[ $name =~ .*[^X]([oa]) ]]; do 
    name=${name/$BASH_REMATCH/${BASH_REMATCH:0:-1}X${BASH_REMATCH[1]}} 
done 
echo $name 

。両方の例

jXoshuXa 

NJOYのため

出力!

関連する問題