BASHの置換式に正規表現を含めるにはどうすればよいですか?bash regexの置き換えでキャプチャを参照する方法
非作業例:
#!/bin/bash
name=joshua
echo ${name//[oa]/X\1}
私はマッチした文字に置き換えられて\1
で出力jXoshuXa
に期待しています。
これは実際には機能しませんが、代わりにjX1shuX1
を出力します。おそらく、
BASHの置換式に正規表現を含めるにはどうすればよいですか?bash regexの置き換えでキャプチャを参照する方法
非作業例:
#!/bin/bash
name=joshua
echo ${name//[oa]/X\1}
私はマッチした文字に置き換えられて\1
で出力jXoshuXa
に期待しています。
これは実際には機能しませんが、代わりにjX1shuX1
を出力します。おそらく、
bash> name=joshua
bash> echo $name | sed 's/\([oa]\)/X\1/g'
jXoshuXa
sedを手に入れようとするなら、これは簡単です: 's/[oa]/X&/ g' –
ありがとう!私は 'sed'を呼ぶことなくそれをやることができるようにしたいと考えていましたが、これはちょうどうまくいくはずです。 – joshuapoehls
ないように直感的で、すべての地獄のように、間違いなくあいまいなしかし完全の精神で、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のため
出力!
私のバージョンのbash(4.1.5)では、 '$ {foo/bar/baz}'構文を使って正規表現の置換を行うことができません。なぜあなたはあなたがそれを行うことができるはずだと思うかについての参考文献がありますか? –
私はどこに遭遇したのか分かりませんが、うまくいきます。上記の例を使用すると、 'o'と' a'を 'X'に置き換えていることがわかります。かなり滑らか。 – joshuapoehls
http://tldp.org/LDP/abs/html/parameter-substitution.htmlを参照してください。これについての説明は、ページの3/4ほどです。 –