Рейтинг:0

Разделите последовательности ANSI из строки с помощью кода bash-python

флаг in

Я пытаюсь использовать bash для удаления escape-последовательностей цвета ANSI из строки без успеха. Я уже пробовал код на основе регулярных выражений.

#!/бин/баш

Синий='\033[0;34m' # Синий
Clear='\033[0m' # Сброс текста

удалитьЦвета(){
    местный uncolored_string=''
    
    local import_row='импортировать повторно; \n'
    локальное регулярное выражение_='(\x9B|\x1B\[)[0-?]*[ -\/]*[@-~]'
    local func_def_row='def escape_ansi(строка): \n'
    местный ansi_escape_row="ansi_escape=re.compile(r\'$regex_\') \n" 
    local return_row="return ansi_escape.sub('', строка) \n"
    local print_row="print escape_ansi(line = '$1')"

    локальный код="$import_row$func_def_row$ansi_escape_row$return_row$print_row"
    
    эхо $(python -c $код)
}

str="Нажмите ${Blue}любую клавишу${Clear}, чтобы продолжить..."
эхо -e "$стр"

removeColors "$str"

Я все еще получаю код ниже.

  Файл "<строка>", строка 1
    импорт
         ^
SyntaxError: неверный синтаксис

Вы можете мне помочь?

Обновлять:

Я нашел библиотеку python стрип-анси.

удалитьЦвета(){
    местный uncolored_string=''
    местный ansi_snippet="$1"
    
    echo "$(python3 -c "из strip_ansi import strip_ansi; print(strip_ansi(\"$ansi_snippet\"))")"
}

Однако даже после его установки я получаю следующую ошибку:

Traceback (последний последний вызов):
  Файл "<string>", строка 1, в <module>
ModuleNotFoundError: нет модуля с именем «strip_ansi»
флаг hr
Я действительно не понимаю, что вы пытаетесь здесь сделать, однако вы получите ту же ошибку от `python -c import`, так что, возможно, * первая * проблема заключается в переменной оболочки `$ code` без кавычек?
Bruno Henrique Peixoto avatar
флаг in
Это очень даже начало. Спасибо:)
флаг hr
... между прочим, я бы предложил использовать здесь документ для подобных вещей, а не пытаться смешать все в многострочную строку. См., например, [Гибридный код в сценариях оболочки. Совместное использование переменных] (https://unix.stackexchange.com/questions/74244/hybrid-code-in-shell-scripts-sharing-variables)
pLumo avatar
флаг in
... или отдельный файл сценария.
pLumo avatar
флаг in
`\n` здесь не воспринимается буквально. Вы можете использовать `$'...'`. Однако у вас также есть ошибки увеличения для `ansi_escape_row` и `return_row`. И, наверное, другие проблемы. Лучше не смешивать код оболочки и Python.
Bruno Henrique Peixoto avatar
флаг in
Я обновил вопрос с некоторым прогрессом. Можете ли вы продолжить расследование этой загадки?
pLumo avatar
флаг in
Как вы его установили? Какая версия `python` возвращает `pip -V`. Если 2.x, вы можете попробовать `pip3 install strip_ansi` или `python3 -m pip install strip_ansi`
Bruno Henrique Peixoto avatar
флаг in
Версия Pip: pip 22.0.3 из $path (python 3.8) pip3 install strip-ansi: Требование уже выполнено: strip-ansi в $LOCAL_PATH
pLumo avatar
флаг in
Кстати, почему бы вам не использовать [`ansi2txt`](https://unix.stackexchange.com/questions/14684/removing-control-chars-включая-console-codes-colours-from-script-output/527259# 527259) ?
pLumo avatar
флаг in
Вы устанавливаете `strip-ansi`, но используете `strip_ansi` с подчеркиванием. В документации есть две разные версии инструкции по их установке?!
Bruno Henrique Peixoto avatar
флаг in
Библиотека ansi2txt показалась отличной, но не работала для примера: echo "$(echo "Нажмите \033[0;34много клавиш\033[0m, чтобы продолжить..." | ansi2txt | col -b)" Не могли бы вы запустить его для меня, сэр?
pLumo avatar
флаг in
Проблема в `echo` , он не оценивает коды ansi. Используйте `echo -e` или `printf`, и все работает отлично.
Bruno Henrique Peixoto avatar
флаг in
ОТЛИЧНЫЙ! Спасибо, сэр. :)
Рейтинг:1
флаг in

Решение: эхо -е "$1" | ansi2txt | столбец -b

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.