Я пытаюсь выполнить поиск и замену переменной, используя расширение параметра $ {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$
источник
extglob
действительно влияет на поведение сопоставления с образцом.*([0-9])
это эквивалент[0-9]*
использованияextglob
.Ответы:
Похоже, вы хотите удалить вещи между
\[
и\]
:Тем не менее,
bash
замена настолько неэффективна, что вам, вероятно, было бы лучше уволитьperl
илиsed
здесь, или сделать это в виде цикла:(это стандартный синтаксис POSIX sh выше, кстати).
И если вы хотите расширенное приглашение от этого:
источник
[
и]
, Спасибо!После некоторых указаний от jordanm (и прочтения раздела «Сопоставление с образцом» на справочной странице bash) выясняется, что эти шаблоны, используемые расширением параметров, не являются регулярными выражениями. Однако для моего конкретного случая, если
shopt extglob
включен, я могу сделать:где так
*([0-9])
же, как[0-9]*
в регулярных выражениях.Похоже, что extglob предоставляет некоторые механизмы, схожие с regex (из страницы руководства bash):
источник
extglob
реализует подмножествоksh
расширенных глобусов.ksh93
на самом деле есть оператор printf для преобразования между шаблонами и (AT & T) RE (printf '%P\n' '\\\[[0-9]*\\\]'
дает*\\\[*([0-9])\\\]*
)Pure Bash поддерживает полный диапазон последовательностей ANSI
источник