この代替正規表現を使用することには少し難しいことがあり、なぜこのように動作するのか理解できません。私がしたいのは、最後の数字以降のすべての数字を変更することです/
。
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
できますが、次のように正規表現置換を実行することもできます。ksh
setopt kshglob
zsh
extendedglob
[[: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