Saya mencoba melakukan pencarian dan mengganti variabel menggunakan ekspansi parameter $ {VAR // search / replace}. Saya memiliki PS1 yang cukup panjang dan jahat, bahwa saya ingin menghitung ukuran setelah ekspansi. Untuk melakukannya saya harus menghapus banyak urutan pelarian yang saya masukkan ke dalamnya. Namun ketika mencoba untuk menghapus semua urutan SGR ANSI CSI saya telah menemukan masalah dengan sintaksis saya.
Diberikan PS1 saya dari:
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$
(Ya itu sakit aku tahu ...)
Saya coba lakukan:
# readability
search='\\\[\\033\[[0-9]*m\\\]'
# do the magic
sane="${PS1//$search/}"
Namun ini tampaknya serakah pada titik [0-9]
(hampir seperti [0-9]
diperlakukan sebagai .
gantinya):
echo "${PS1//$search/}"
\[\033]0;[\h] \w\007\]\n$
Jika saya menghapus *
, dan mengubah [0-9]
ke [0-9][0-9]
(karena itu lebih ilustratif) saya semakin mendekati hasil yang diharapkan:
$ 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$
Mengapa *
(nol atau lebih) melakukan hal-hal gila? apakah saya melewatkan sesuatu di sini? Jika saya melewati regex yang sama melalui sed saya mendapatkan hasil yang diharapkan:
echo $PS1 | sed "s/$search//g"
\[\033]0;[\h] \w\007\](\u@\h)-(\t)-(\w)$(git_branch)\n$
*([0-9])
adalah setara [0-9]*
dengan menggunakan extglob
.
extglob
tidak mempengaruhi perilaku pencocokan pola.