Как удалить формат Color / Style из переменной - PullRequest
1 голос
/ 25 сентября 2019

У меня переменная с несколькими словами в разных цветах и ​​стилях.Как я могу удалить стили и распечатать в виде простого текста.Мое фактическое требование - когда я делаю подсчет слов.Он также учитывает символы стилей.

Пример:

    RED=$(tput setaf 1) 
    NORMAL=$(tput sgr0) 
    BOLD=$(tput bold)

    string=$(printf "this ${RED}${BOLD}is${NORMAL} a test1\n")
    echo "$string" | wc -c

вывод:

    31

Фактический подсчет

printf "this is a test1\n" | wc -c

вывод

    16

Как узнать фактический счет?

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Удаление цветовых кодов ANSI из строки может быть достигнуто с помощью расширенной функции глобализации extglob в Bash, например:

#!/usr/bin/env bash

shopt -s extglob # Enable Bash Extended Globbing expressions

RED=$(tput setaf 1)
NORMAL=$(tput sgr0)
BOLD=$(tput bold)

# This is how to add control characters without echoing in a subshell
string="this ${RED}${BOLD}is${NORMAL} a test1"$'\n'

printf 'Before stripping ANSI color codes:\n%s\ncontains %d characters\n\n' "$string" "${#string}"

# Use the extended globbing with string substitution
# to remove all ANSI control sequences from string
no_color_string="${string//$'\e'[\[(]*([0-9;])[@-n]/}"

printf 'After stripping ANSI color codes:\n%s\ncontains %d characters\n\n' "$no_color_string" "${#no_color_string}"

Вывод:

Example output

1 голос
/ 25 сентября 2019

tput генерирует коды на основе типа терминала.Так же как и vt52 / vt100 / vtxx, он может работать с терминалами других типов.Это может, например, генерировать HTML.

Не существует эквивалентного пакета ncurses для удаления их, и вы не можете предсказать тип терминала, поэтому вы не можете идеально удалить эту информацию.

Тем не менее, ваши данные довольновозможно VT, который использует escape-коды, которые вы могли бы убрать.Все они имеют форму \033XXXm например \033[38;5;206m, которую можно легко удалить с помощью sed.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...