Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
2802 / 500 / 120
Регистрация: 26.09.2020
Сообщений: 946
Записей в блоге: 5

Расчёт длины c ANSI эскейп‑последовательностями

03.12.2025, 10:30. Показов 2874. Ответов 47

Студворк — интернет-сервис помощи студентам

Как рассчитать длину только видимой части строки c ANSI escape‑последовательностями?



Пример вывода длины строки, включая невидимые символы:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
.{
    $e = [char] 27
 
    $reset = "$e[0m"
    $bold  = "$e[1m"
 
    $black   = "$e[30m"
    $red     = "$e[31m"
    $green   = "$e[32m"
    $yellow  = "$e[33m"
    $blue    = "$e[34m"
    $magenta = "$e[35m"
    $cyan    = "$e[36m"
    $gray    = "$e[37m"
 
    $darkGray      = "$e[90m"
    $brightRed     = "$e[91m"
    $brightGreen   = "$e[92m"
    $brightYellow  = "$e[93m"
    $brightBlue    = "$e[94m"
    $brightMagenta = "$e[95m"
    $brightCyan    = "$e[96m"
    $white         = "$e[97m"
 
    $string = '`n${bold}${red}TEST-11${reset}`n${yellow}TEST-21${reset}`n${green}TEST-31${reset}`n'
    $expanded = $ExecutionContext.InvokeCommand.ExpandString($string)
    [string[]] $lines = $expanded -split '\r?\n'
 
    Clear-Host
    Write-Host $expanded
 
    Write-Host ("Всего строк: {0}" -f $lines.Count)
 
    for ($i = 1; $i -le $lines.Count; $i++) {
        Write-Host ('Длина строки {0}: {1} символов' -f $i, ($lines[$i-1].Length))
    }
}
«TEST-11» — 7 знаков должно быть.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.12.2025, 10:30
Ответы с готовыми решениями:

Перекодировка текстового файла из ANSI в UTF-8
Здравствуйте, я нашел такой BAT файл, который перекодирует txt файл из ANSI в UNICODE Как его можно...

Батником поменять кодировку с utf-8 в ansi, и наоборот
Подскажите пожалуйста как батником поменять кодировку с utf-8 в ansi, и наоборот?! файл текстовый...

Преобразовать текстовый файл из ANSI в UTF-8
Здравствуйте, подскажите, как из командной строки преобразовать текстовый файл из ANSI в UTF-8?...

47
2802 / 500 / 120
Регистрация: 26.09.2020
Сообщений: 946
Записей в блоге: 5
04.12.2025, 12:14  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от YuS_2 Посмотреть сообщение
это тоже можешь попробовать:
теряет форматирование
PowerShell
1
2
3
$a = "`e[32;5;214mtest`e[0m"
$a # мигает?
$a -replace "(\e[^m]+m)([^\e]+)(\e[^m]+m)?",{$([string]$_.groups[2]).substring(2)} # мигает?
0
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,215
04.12.2025, 13:32
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
По ссылке не переходит?
переходит, но там нет ничего, кроме сообщения о том, что:
Вложение не существует или не указан идентификатор (номер). Если вы уверены, что использовали правильную ссылку, свяжитесь с администрацией
Но картинку теперь вижу, в новом сообщении...

Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
теряет форматирование
Ты чего, какое форматирование?! Это всего лишь пример, причем второй группы, в которой исключительно текст и никакого форматирования...
Ну, ок, вот так понятнее будет, наверное:
PowerShell
1
2
3
4
5
6
7
8
9
10
$a = "$([char]27)[38;5;214mHello, world$([char]27)[0m"+"`e[38;5;112mtest & test`e[0mab"
"Исходная строка:"
$a
"================"
$a -replace "(\e[^m]+m)([^\e]+)(\e[^m]+m)?",{
    [string]$_.groups[1]+([string]$_.groups[2]).substring(2)+$_.groups[3]
}
$a -replace "(\e[^m]+m)([^\e]+)(\e[^m]+m)?",{
    [string]$_.groups[1]+([string]$_.groups[2]).padleft(15,'Ц')+$_.groups[3]
}
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
Результат для ограничения по ширине, так хотелось:
Другими словами, для твоего стартового поста, без переделки:
PowerShell
1
2
3
4
5
...
$expanded  -replace "(\e[^m]+m)([^\e]+)(\e[^m]+m)?",{
    [string]$_.groups[1]+([string]$_.groups[2]).substring(0,6)+$_.groups[3]
}
...
- получишь то, что хотелось, как на картинке...
1
2802 / 500 / 120
Регистрация: 26.09.2020
Сообщений: 946
Записей в блоге: 5
04.12.2025, 14:14  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
$expanded -replace "(\e[^m]+m)([^\e]+)(\e[^m]+m)?",{
[string]$_.groups[1]+([string]$_.groups[2]).substring(0,6)+$_.groups[3]
}
Вот так нагляднее, это я понимаю

Но не понимаю, откуда первая скобка берёт формат…
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
.{
    $e = [char] 27
 
    $reset = "$e[0m"
    $bold = "$e[1m"
 
    $black = "$e[30m"
    $red = "$e[31m"
    $green = "$e[32m"
    $yellow = "$e[33m"
    $blue = "$e[34m"
    $magenta = "$e[35m"
    $cyan = "$e[36m"
    $gray = "$e[37m"
 
    $darkGray = "$e[90m"
    $brightRed = "$e[91m"
    $brightGreen = "$e[92m"
    $brightYellow = "$e[93m"
    $brightBlue = "$e[94m"
    $brightMagenta = "$e[95m"
    $brightCyan = "$e[96m"
    $white = "$e[97m"
 
    $string = '`n${bold}${red}TEST-11${reset}`n${yellow}TEST-21${reset}`n${green}TEST-31${reset}`n'
    $expanded = $ExecutionContext.InvokeCommand.ExpandString($string)
    [string[]] $lines = $expanded -split '\r?\n'
 
    Clear-Host
    Write-Host $expanded
 
    Write-Host ('Всего строк: {0}' -f $lines.Count)
 
    for ($i = 1; $i -le $lines.Count; $i++) {
        Write-Host ('Длина строки {0}: {1} символов' -f $i, ($lines[$i - 1].Length))
    }
 
    $expanded -replace '(\e[^m]+m)([^\e]+)(\e[^m]+m)?', {
        '[' + [string]$_.groups[1] + ([string]$_.groups[2]).substring(0, 6).PadRight(20) + $_.groups[3] + ']'
    }
}
0
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,215
04.12.2025, 14:53
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
Но не понимаю, откуда первая скобка берёт формат…
Хмм, тут этих скобок... о какой речь?
0
2802 / 500 / 120
Регистрация: 26.09.2020
Сообщений: 946
Записей в блоге: 5
04.12.2025, 15:06  [ТС]
В выводе естественно, первая квадратная скобка.
И на PowerShell 5.1 не работает
Миниатюры
Расчёт длины c ANSI эскейп‑последовательностями  
0
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,215
04.12.2025, 15:27
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
В выводе естественно, первая квадратная скобка.
хз... видимо, где-то сброс не обозначен... попробуй добавить в скриптблоке первой строкой ${reset}
или прямо перед скобками, обеими

Добавлено через 6 минут
а ещё, вполне может быть, что шаблон регэкспов не совсем верно написан... замени на такой:
'(\e[^m]+m)([^\e]+)(\e\[0m)?'
0
 Аватар для volodin661
6686 / 2278 / 347
Регистрация: 10.12.2013
Сообщений: 7,863
04.12.2025, 15:47
Извиняюсь, не вчитывался, но я бы предложил формировать цветную строку не интерполяцией цветных скаляров
в строку с двойными кавычками "${red}Красная шапочка${reset} на самом деле {$green}зеленая",
а вместо цветных скаляров нагенерить цветные функции.

red("Krasnaya") + reset("шапочка на самом деле") + green("Zelenaya")

Во-первых смотрится лучше, а во-вторых, такой подход позволит внутри данных функций производить любые действия; в том числе суммировать в глобальном сумматоре длины пришедших для покраски текстовых аргументов.

Добавлено через 7 минут
( про генерацию функций см. Как часть имени переменной (объекта) задать содержанием другой переменной? )
1
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,215
04.12.2025, 15:52
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
на PowerShell 5.1 не работает
ну да, скриптблоки в реплэйсе появились на седьмой, вроде бы, версии...
вот, volodin661, предлагает функциями красить текст, тоже думаю более практично и в 5.1 будет работать...
0
 Аватар для volodin661
6686 / 2278 / 347
Регистрация: 10.12.2013
Сообщений: 7,863
04.12.2025, 16:07
Цитата Сообщение от YuS_2 Посмотреть сообщение
volodin661, предлагает функциями красить текст
Функция - самая могучая парадигма в программировании, грех не воспользоваться.
0
2802 / 500 / 120
Регистрация: 26.09.2020
Сообщений: 946
Записей в блоге: 5
04.12.2025, 17:30  [ТС]
Строка идёт параметром, в одинарных кавычках, так как в ней указаны ещё несуществующие переменные, сами переменные в скрипте/функции объявляются, а затем вызывается $ExecutionContext.InvokeCommand.ExpandSt ring($string), которая и раскрывает переменные.

Идея использовать вычисляемые внутри переменные, а указывать их или нет, их формат, извне параметром.
Цвет заодно. Подумалось, что говорящие названия лучше.
Но чего-то усложняется сильно, вернуться к [consolecolor] что ли

Поймал, мучаю китайского агента C Li Q Wen, сопротивляется, но коды выдаёт.
Тоже откуда-то белая, на сей раз одинарная кавычка у обрезков вылазит.
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
enum TokenType {
    Literal
    ControlSequence
    End
}
 
# Класс для представления токенов
class Token {
    [TokenType] $Type
    [string] $Value
 
    Token ([TokenType] $type) {
        $this.Type = $type
        $this.Value = ""
    }
 
    Token ([TokenType] $type, [string] $value) {
        $this.Type = $type
        $this.Value = $value
    }
}
 
# Лексический анализатор для управляющих последовательностей
class Lexer {
    [string] $in
    [int] $position
 
    Lexer ([string] $in) {
        $this.in = $in
        $this.position = 0
    }
 
    [Token] GetNextToken() {
        # Конец строки
        if ($this.position -ge $this.in.Length) {
            return [Token]::new([TokenType]::End)
        }
 
        [char] $current = $this.in[$this.position]
 
        # Управляющая последовательность начинается с ESC (27) и заканчивается 'm'
        if ($current -eq [char]27 -and $this.position + 1 -lt $this.in.Length -and $this.in[$this.position + 1] -eq '[') {
            return $this.ReadControlSequence()
        }
 
        # Обычный символ
        return $this.ReadLiteral()
    }
 
    [Token] ReadControlSequence() {
        [int] $start = $this.position
 
        # Пропускаем ESC[
        $this.position += 2
 
        # Читаем до символа 'm'
        while ($this.position -lt $this.in.Length -and $this.in[$this.position] -ne 'm') {
            $this.position++
        }
 
        # Если не найден 'm', это ошибка, возвращаем как литерал
        if ($this.position -ge $this.in.Length) {
            $this.position = $start
            return $this.ReadLiteral()
        }
 
        # Включаем 'm' в последовательность
        $this.position++
 
        [string] $sequence = $this.in.Substring($start, $this.position - $start)
        return [Token]::new([TokenType]::ControlSequence, $sequence)
    }
 
    [Token] ReadLiteral() {
        [int] $start = $this.position
 
        # Читаем до начала управляющей последовательности или конца строки
        while ($this.position -lt $this.in.Length) {
            [char] $current = $this.in[$this.position]
 
            # Проверяем начало управляющей последовательности
            if ($current -eq [char]27 -and $this.position + 1 -lt $this.in.Length -and $this.in[$this.position + 1] -eq '[') {
                break
            }
 
            $this.position++
        }
 
        [string] $literal = $this.in.Substring($start, $this.position - $start)
        return [Token]::new([TokenType]::Literal, $literal)
    }
}
 
# Класс для работы с форматированными строками
class FormattedString {
    [string] $Text
 
    FormattedString([string] $text) {
        $this.Text = $text
    }
 
    # Возвращает видимую длину строки (без учета управляющих последовательностей)
    [int] GetDisplayLength() {
        [Lexer] $lexer = [Lexer]::new($this.Text)
        [Token] $token = $lexer.GetNextToken()
        [int] $length = 0
 
        while ($token.Type -ne [TokenType]::End) {
            if ($token.Type -eq [TokenType]::Literal) {
                $length += $token.Value.Length
            }
            # Управляющие последовательности не увеличивают видимую длину
            $token = $lexer.GetNextToken()
        }
 
        return $length
    }
 
    # Обрезает строку до заданной видимой длины, сохраняя форматирование
    [string] Substring([int] $maxLength) {
        [Lexer] $lexer = [Lexer]::new($this.Text)
        [Token] $token = $lexer.GetNextToken()
        [string] $result = ""
        [int] $displayLength = 0
 
        while ($token.Type -ne [TokenType]::End -and $displayLength -lt $maxLength) {
            if ($token.Type -eq [TokenType]::Literal) {
                # Проверяем, нужно ли усечь этот литерал
                [int] $remaining = $maxLength - $displayLength
                if ($token.Value.Length -le $remaining) {
                    $result += $token.Value
                    $displayLength += $token.Value.Length
                } else {
                    $result += $token.Value.Substring(0, $remaining)
                    $displayLength = $maxLength  # Достигли максимальной длины
                }
            } elseif ($token.Type -eq [TokenType]::ControlSequence) {
                # Управляющие последовательности добавляем без изменения
                $result += $token.Value
            }
            $token = $lexer.GetNextToken()
        }
 
        return $result
    }
 
    # Дополняет строку пробелами справа до заданной видимой длины
    [string] PadRight([int] $totalWidth) {
        [int] $currentDisplayLength = $this.GetDisplayLength()
        if ($currentDisplayLength -ge $totalWidth) {
            return $this.Text
        }
 
        [int] $padding = $totalWidth - $currentDisplayLength
        [string] $result = $this.Text
 
        # Если строка содержит управляющие последовательности и не заканчивается на сброс,
        # временно добавим сброс, чтобы не испортить следующий текст
        [bool] $endsWithReset = $result.EndsWith([char]27 + "[0m")
        if (-not $endsWithReset) {
            $result += [char]27 + "[0m"
            # Добавляем нужное количество пробелов
            $result += ' ' * $padding
            # Добавляем снова сброс, чтобы форматирование точно закончилось
            $result += [char]27 + "[0m"
        } else {
            # Добавляем нужное количество пробелов
            $result += ' ' * $padding
        }
 
        return $result
    }
}
 
# Объявляем все переменные цвета
$e = [char] 27
 
$reset = "$e[0m"
$bold  = "$e[1m"
 
$black   = "$e[30m"
$red     = "$e[31m"
$green   = "$e[32m"
$yellow  = "$e[33m"
$blue    = "$e[34m"
$magenta = "$e[35m"
$cyan    = "$e[36m"
$gray    = "$e[37m"
 
$darkGray      = "$e[90m"
$brightRed     = "$e[91m"
$brightGreen   = "$e[92m"
$brightYellow  = "$e[93m"
$brightBlue    = "$e[94m"
$brightMagenta = "$e[95m"
$brightCyan    = "$e[96m"
$white         = "$e[97m"
 
$originalString = '`n${bold}${red}TEST-11${reset}`n${yellow}TEST-21${reset}`n${green}TEST-31${reset}`n'
$expanded = $ExecutionContext.InvokeCommand.ExpandString($originalString)
$lines = $expanded -split "`n"
 
Write-Host ("Оригинальная строка: {0}" -f $originalString)
 
Write-Host "Расширенная строка:"
$expanded
 
Write-Host "Количество строк после разделения: $($lines.Count)`n"
 
for ($i = 0; $i -lt $lines.Count; $i++) {
    $formattedLine = [FormattedString]::new($lines[$i])
    Write-Host "Строка $i (длина $($formattedLine.GetDisplayLength())): $($lines[$i])" -NoNewline
 
    # Обрезаем строку до 6 символов
    if ($formattedLine.GetDisplayLength() -gt 6) {
        $trimmedLine = $formattedLine.Substring(6)
        Write-Host "  Обрезанная до 6: '$trimmedLine' (длина: $($([FormattedString]::new($trimmedLine)).GetDisplayLength()))"
    } else {
        Write-Host ''
    }
}
0
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,215
04.12.2025, 20:29
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
Цвет заодно. Подумалось, что говорящие названия лучше.
Но чего-то усложняется сильно, вернуться к [consolecolor] что ли
Есть же встроенные инстрУменты
типа:
PowerShell
1
"`nЗапущен $($psstyle.background.blue)PowerShell$($psstyle.reset) $($psstyle.foreground.yellow)v{0}$($psstyle.reset) в ОС $($psstyle.foreground.magenta){1}$($psstyle.reset)." -f $($psversiontable.psversion),(gcim win32_operatingsystem).caption
но это опять же, с версии PS 7.2 и новее, но есть модули, внедряющие $PSStyle функционал в PS v5.1, при необходимости...

Добавлено через 4 минуты
Цитата Сообщение от volodin661 Посмотреть сообщение
Функция - самая могучая парадигма в программировании, грех не воспользоваться.
Дык, кто спорит... мощь присутствует, бесспорно... и даже более того, можно даже велосипеды не изобретать, а поискать на гитхабе, например, вот
0
 Аватар для volodin661
6686 / 2278 / 347
Регистрация: 10.12.2013
Сообщений: 7,863
04.12.2025, 21:59
я попытался понять исходную задачу iКеши, но не понял.
0
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,215
05.12.2025, 09:21
Цитата Сообщение от volodin661 Посмотреть сообщение
я попытался понять исходную задачу iКеши, но не понял.
Дык, вроде из названия и вот этого:
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
если строка больше 6 символов, то режем до 6 символов, форматирование escape-последовательностями сохранить. Если меньше 6, то дополнить пробелами (PadRight).
- я понял так, что цель не сама раскраска строк, а обработка уже раскрашенных, которые поступают на вход. Код обработки должен выделить из раскрашенной строки, собственно, текст, посчитать длину, обрезать/добавить символы и затем вернуть раскраску так, как было до подсчета... по-моему, это было целью топика.
Но, лично я так и не понял пока один момент... например, если строка длинная, т.е. часть раскрашена, часть нет или несколько раскрашенных частей в одной строке, тогда, что именно считать по длине, то ли всю строку, то ли раскрашенную часть (и), а также, что именно обрезать/удлинять...
1
2802 / 500 / 120
Регистрация: 26.09.2020
Сообщений: 946
Записей в блоге: 5
05.12.2025, 09:26  [ТС]
volodin661, не знаю, чего не понятно.
В строке с ANSI эскейп‑последовательностями: подсчитывать длину, обрезать, выравнивать пробелами, всё для видимых знаков, сохраняя цвета, переносы строк.

Для примерно такого:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
function foo ( [string] $string, [int] $n ) {
    1..$n | % { $i = $_
        $expanded = $ExecutionContext.InvokeCommand.ExpandString($string)
        [string[]] $lines = $expanded -split '\r?\n'
        foreach ($line in $lines) {
            Write-Host $line }
        sleep 1
    }
}
# Вызов функции с разными строками вывода, а задаём строки при вызове функции
foo -string '`nВсего: $n`nСейчас: $i' -n 5
foo -string '`n$i из $n' -n 5
foo -string '`n`e[36;1m$i`e[0m из $n' -n 5
0
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,215
05.12.2025, 09:27
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
подсчитывать длину, обрезать, выравнивать пробелами, всё для видимых знаков, сохраняя цвета, переносы строк.
уточни, я там выше написал... всю строку или исключительно раскрашенную часть необходимо считать?
0
2802 / 500 / 120
Регистрация: 26.09.2020
Сообщений: 946
Записей в блоге: 5
05.12.2025, 09:35  [ТС]
YuS_2, всю, конечный вывод, $line в примере выше.

Если попадает обрез на раскрашенную, то обрезанная часть должна быть раскрашена, но обрезана. Значит обрезать, а `e[0m не забыть поле обрезки, если он был.
0
1658 / 273 / 66
Регистрация: 03.06.2020
Сообщений: 689
05.12.2025, 09:41
На мой взгляд только в вывод, в самую последнюю операцию, надо подставлять последовательности. Тогда не будет проблем с форматированием.

PowerShell
1
2
"`e[91m{0,-10}`e[0m{1}" -f "строка 1", "строка 2"     # как и задумано
"{0,-10}{1}" -f "`e[91mстрока 1`e[0m", "строка 2"     # битое форматирование
0
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,215
05.12.2025, 09:43
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
Если попадает обрез на раскрашенную, то обрезанная часть должна быть раскрашена, но обрезана. Значит обрезать, а `e[0m не забыть поле обрезки, если он был.
Вооот, в этом-то вся загвоздка...
Допустим, строка:
abcdefg.
- необходимо обрезать ВСЮ строку до 3 символов. Тогда, должно быть:
abc.
Правильно?
0
2802 / 500 / 120
Регистрация: 26.09.2020
Сообщений: 946
Записей в блоге: 5
05.12.2025, 09:51  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
Правильно?
Именно.

Добавлено через 6 минут
lesser, а как получить -f "строка 1", "строка 2" ?
0
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,215
05.12.2025, 10:18
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
Именно.
Воот, теперь рассматриваем такую ситуацию:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
$e = [char]27
$a = "Строка: $e[38;5;214mHello, world$e[0m здесь тоже строка $e[38;5;112mtest & test$e[0m и ещё строка"
"Исходная строка:"
$a
"Длина: $($a.length)"
""
"Строка без спецсимволов:"
$a -replace '(\e[^m]+m)([^\e]+)(\e\[0m)?','$2'
"Длина без спецсимволов: $(($a -replace '(\e[^m]+m)([^\e]+)(\e\[0m)?','$2').length)"
""
"================"
Допустим, строка должна стать длиной 45 символов онли текстовых символов.
У нас должно получиться, что? Это:
PowerShell
1
2
3
$e = [char]27
$res = "Строка: $e[38;5;214mHello, world$e[0m здесь тоже строка $e[38;5;112mtest &$e[0m"
$res
? Если да, то вот исходя из этого и необходимо писать код в целом...
Отдельные раскрашенные части обрезать/удлинить - не представляет большой сложности, а вот если строка содержит несколько раскрашенных частей, а резать или удлинять необходимо только исходя из длины текста без спецсимволов, то здесь необходимо почесать "тыкву" уже... как это сделать оптимальнее.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.12.2025, 10:18
Помогаю со студенческими работами здесь

Иероглифы в батнике (ANSI)
Привет всем. Помогите разобраться: нашел на просторах иннета батник для блокирования файла...

Как поменять кодировку всех текстовых файлов в папке (с UTF-8 на ANSI)
Добрый день уважаемые программисты и люди связанные с пк индустрией. Возникла потребность...

Написать программу (скрипт) расчета разности размеров самого большого и самого маленького файлов папки
ПОМОГИТЕ)))

Написать программу (скрипт) расчета разности первого и второго по размерам файла папки
Пожалуйста,помогите!! Создать текстовый файл результатов тестирования локальной сети помещенных...

Расчёт дат для их использования в именах файлов и папок при переименовании
День добрый!!! мне нужна помощь, подскажите как написать БАТНИК, что бы можно было копировать одну...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru