bash $ {VAR // search / replace}と奇妙な正規表現の動作
$ {VAR // search / replace}パラメータ展開を使用して、変数を検索および置換しようとしています。私はかなり長くて邪悪なPS1を持っているので、拡張後のサイズを計算します。そのためには、そこに詰め込んだ一連のエスケープシーケンスを削除する必要があります。ただし、すべてのANSI CSI SGRシーケンスを削除しようとすると、構文の問題に遭遇しました。 私のPS1を考えると: PS1=\[\033]0;[\h] \w\007\]\[\033[1m\]\[\033[37m\](\[\033[m\]\[\033[35m\]\u@\[\033[m \]\[\033[32m\]\h\[\033[1m\]\[\033[37m\]\[\033[1m\])\[\033[m\]-\[\033[1m\](\[\033[m \]\t\[\033[37m\]\[\033[1m\])\[\033[m\]-\[\033[1m\](\[\033[m\]\[\033[36m\]\w\[\033[1m \]\[\033[37m\])\[\033[35m\]${git_branch}\[\033[m\]\n$ (はい、それは私が知っている病気です...) 私がやろうとしていること: # readability search='\\\[\\033\[[0-9]*m\\\]' # do the magic sane="${PS1//$search/}" しかし、これらは[0-9](ほとんどの[0-9]場合、.代わりにaのように扱われる)時点で貪欲であるようです: echo "${PS1//$search/}" \[\033]0;[\h] \w\007\]\n$ を削除して*に変更[0-9]すると[0-9][0-9](よりわかりやすくなります)、期待される結果に近づきます。 $ search='\\\[\\033\[[0-9][0-9]m\\\]' $ echo "${PS1//$search/}" \[\033]0;[\h] \w\007\]\[\033[1m\](\[\033[m\]\u@\[\033[m\]\h\[\033[1m \]\[\033[1m\])\[\033[m\]-\[\033[1m\](\[\033[m\]\t\[\033[1m\])\[\033[m\]-\[\033[1m \](\[\033[m\]\w\[\033[1m\])$(git_branch)\[\033[m\]\n$ なぜ*(ゼロ以上)クレイジーなことをしているのですか?ここで何か不足していますか?同じ正規表現をsedに渡すと、期待どおりの結果が得られます。 echo $PS1 | sed "s/$search//g" \[\033]0;[\h] \w\007\](\u@\h)-(\t)-(\w)$(git_branch)\n$