文字列数値正規表現の置換

文字列数値正規表現の置換

この代替正規表現を使用することには少し難しいことがあり、なぜこのように動作するのか理解できません。私がしたいのは、最後の数字以降のすべての数字を変更することです/

str="aa/a0b0/42"
echo ${str/%[[:digit:]]*/5}
echo ${str/%[0-9]*/5}

両方ともecho出力として生成されます。aa/a5予想される出力はですaa/a0b0/5

sed私は同じツールを使って私の問題を解決できることをよく知っており、awkこれを行う方法も知っていますが、bash専用のソリューションを探しています。

[0-9]*拡張が単純な数字ではなく0b0/42である理由を理解したいと思います。

私の正規表現の内容は%次のとおりです。バックエンドの交換

答え1

それが一つだからパターンマッチング、正規表現ではありません。

[[:digit:]]*1桁の数字の後にランダムな文字列が続くことを示すため、0b0/42一致が発生します。 1桁の数字、0その後の文字列b0/42

bashこれで有効にすると、1つ以上のパターン発生を次のように一致させるextglobことができます。+(pattern-list)

$ shopt -s extglob
$ printf '%s\n' "${str/%+([[:digit:]])/5}"
aa/a0b0/5

kshデフォルトでは、からコピーされた構文がありますbash

では、これらのパターンを結合したり、独自のパターン()を使用したりzshできますが、次のように正規表現置換を実行することもできます。kshsetopt kshglobzshextendedglob[[:digit:]]##正規表現の置換 機能:

$ str="aa/a0b0/42"
$ autoload -U regexp-replace
$ regexp-replace str '[[:digit:]]+$' 5
$ print -rl -- $str
aa/a0b0/5

/後ろの最後の部分が常に数値であることを確認したい場合は、POSIXlyで行うことができます。

printf '%s/%s\n' "${str%/*}" 5

関連情報