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$
sumber
extglob
tidak mempengaruhi perilaku pencocokan pola.*([0-9])
adalah setara[0-9]*
dengan menggunakanextglob
.Jawaban:
Bagi saya, Anda ingin menghapus hal-hal antara
\[
dan\]
:Namun,
bash
penggantian sangat tidak efisien sehingga Anda mungkin akan lebih baik menembakperl
atau dised
sini, atau melakukannya dalam satu lingkaran seperti:(itulah sintaks POSIX sh standar di atas, BTW).
Dan jika Anda ingin prompt yang diperluas dari itu:
sumber
[
dan]
. Terima kasih!Setelah beberapa panduan dari jordanm (dan membaca bagian "Pencocokan Pola" pada halaman bash man), ternyata pola-pola ini digunakan oleh ekspansi parameter bukan regex. Namun untuk kasus khusus saya, jika
shopt extglob
aktif, saya dapat melakukan:di mana
*([0-9])
sama dengan[0-9]*
di regex.Tampaknya extglob menyediakan beberapa mekanisme yang mirip dengan regex dengan (dari halaman bash man):
sumber
extglob
mengimplementasikan subsetksh
gumpalan diperpanjang.ksh93
sebenarnya memiliki operator printf untuk mengkonversi antara pola dan (AT&T) RE (printf '%P\n' '\\\[[0-9]*\\\]'
memberi*\\\[*([0-9])\\\]*
)Pure Bash, rangkaian lengkap rangkaian ANSI yang didukung
sumber