Tôi đang cố gắng thực hiện một số tìm kiếm và thay thế trên một biến bằng cách sử dụng mở rộng tham số $ {VAR // search / thay thế}. Tôi có một PS1 khá dài và xấu, tôi muốn tìm ra kích thước sau khi mở rộng. Để làm như vậy tôi phải loại bỏ một loạt các chuỗi thoát tôi nhét vào đó. Tuy nhiên, khi cố gắng loại bỏ tất cả các chuỗi ANR CSI SGR, tôi đã gặp phải một vấn đề với cú pháp của mình.
Cho PS1 của tôi là:
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$
(vâng, tôi biết là bị bệnh ...)
Tôi đang cố gắng làm:
# readability
search='\\\[\\033\[[0-9]*m\\\]'
# do the magic
sane="${PS1//$search/}"
Tuy nhiên, những điều này dường như là tham lam ở điểm [0-9]
(gần như [0-9]
được đối xử như một .
thay thế):
echo "${PS1//$search/}"
\[\033]0;[\h] \w\007\]\n$
Nếu tôi loại bỏ *
và thay đổi [0-9]
thành [0-9][0-9]
(vì nó mang tính minh họa hơn), tôi sẽ tiến gần hơn đến kết quả mong đợi:
$ 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$
Tại sao *
(không hoặc nhiều hơn) làm những điều điên rồ? Am i thiếu cái gì ở đây? Nếu tôi vượt qua regex tương tự thông qua sed tôi sẽ nhận được kết quả như mong đợi:
echo $PS1 | sed "s/$search//g"
\[\033]0;[\h] \w\007\](\u@\h)-(\t)-(\w)$(git_branch)\n$
*([0-9])
là tương đương với việc [0-9]*
sử dụng extglob
.
extglob
không ảnh hưởng đến hành vi khớp mẫu.