Я пытаюсь выполнить поиск и замену переменной, используя расширение параметра $ {VAR // search / replace}. У меня довольно длинная и злая PS1, которую я хочу отработать размером после расширения. Для этого я должен удалить кучу escape-последовательностей, которые я вставляю в него. Однако, пытаясь удалить все последовательности 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]
рассматривается как .
вместо этого):
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$
*([0-9])
это эквивалент [0-9]*
использования extglob
.
extglob
действительно влияет на поведение сопоставления с образцом.