Ошибочные символы внутри файлов конфигурации в rConfig 3.9.0 [duplicate]

Environment.SpecialFolders.Fonts
32
задан the Tin Man 14 July 2016 в 20:24
поделиться

8 ответов

У меня недостаточно репутации, чтобы добавить комментарий к answer , заданный Luke H , но я хотел бы поделиться регулярным выражением, которое я был используя для исключения всех ASCII Escape Sequences.

sed -r 's~\x01?(\x1B\(B)?\x1B\[([0-9;]*)?[JKmsu]\x02?~~g'
0
ответ дан AGipson 19 August 2018 в 01:32
поделиться

Мне удалось выполнить следующие действия для моих целей, но это не включает все возможные escape-последовательности ANSI :

sed -r s/\x1b\[[0-9;]*m?//g

Это удаляет команды m, но для всех escapes (как комментирует @lethalman):

sed -r s/\x1b\[[^@-~]*[@-~]//g

Также см. « регулярное выражение Python для соответствия escape-последовательностям VT100 ».

Существует также таблицы общих escape-последовательностей .

16
ответ дан Community 19 August 2018 в 01:32
поделиться
  • 1
    Это только ускользает от команды m. Это должно быть более общим \x1b\[[^@-~]*[@-~] – lethalman 2 September 2015 в 16:13
  • 2
    Я специально упомянул, что он не является общим - «... но это не включает все возможные escape-последовательности ANSI ... & quot; – Luke H 3 September 2015 в 08:30
  • 3
    [^@-~]*[@-~] не работал для меня; Мне понадобился [^A-Za-z]*[A-Za-z] (который, похоже, соответствует всем требуемым символам в таблице) – David Fraser 16 August 2017 в 10:19
  • 4
    Обратите внимание, что в BSD (Mac OS X) sed не поддерживает escape-последовательности ANSI-C, такие как \x1b. Таким образом, в этих средах может потребоваться немного опереться на оболочку, если он расширит байк выхода: sed 's/'"$(printf '\x1b')"'\[[^@-~]*[@-~]//g' - Проверено как на BSD, так и на GNU sed в bash4, кажется, работает нормально. – Mark G. 8 May 2018 в 20:08

Я наткнулся на этот пост, когда искал способ снять дополнительное форматирование с man-страниц. ansifilter сделал это, но это было далеко от желаемого результата (например, все ранее выделенные символы дублировались, например SSYYNNOOPPSSIISS).

Для этой задачи правильной командой будет col -bx, например:

groff -man -Tascii fopen.3 | col -bx > fopen.3.txt

(источник)

4
ответ дан gronostaj 19 August 2018 в 01:32
поделиться
  • 1
    Кажется, это вариант col -b, который делает это. В документации говорится, что это удаляет символы обратных пространств: /, go figure. Тем не менее, это самый компактный вариант, который я могу найти, который не требует установки каких-либо вещей (за пределами менеджера пакетов) – Att Righ 8 March 2017 в 16:31
  • 2
    i++ для этого. Не изобретайте велосипед, ребята. См. Также colcrt – tripleee 19 June 2018 в 05:48

Я построил для этого vtclean . Он разделяет escape-последовательности, используя эти регулярные выражения в порядке (объясняется в regex.txt ):

// handles long-form RGB codes
^\033](\d+);([^\033]+)\033\\

// excludes non-movement/color codes
^\033(\[[^a-zA-Z0-9@\?]+|[\(\)]).

// parses movement and color codes
^\033([\[\]]([\d\?]+)?(;[\d\?]+)*)?(.)`)

Кроме того, базовая эмуляция редактирования строк, поэтому обратные пространства и другие символы перемещения (например, левая стрелка).

2
ответ дан lunixbochs 19 August 2018 в 01:32
поделиться

Просто примечание; допустим, у вас есть такой файл (такие окончания строк генерируются удаленными отчетами git):

echo -e "remote: * 27625a8 (HEAD, master) 1st git commit\x1b[K
remote: \x1b[K
remote: \x1b[K
remote: \x1b[K
remote: \x1b[K
remote: \x1b[K
remote: Current branch master is up to date.\x1b[K" > chartest.txt

В двоичном формате это выглядит так:

$ cat chartest.txt | hexdump -C
00000000  72 65 6d 6f 74 65 3a 20  2a 20 32 37 36 32 35 61  |remote: * 27625a|
00000010  38 20 28 48 45 41 44 2c  20 6d 61 73 74 65 72 29  |8 (HEAD, master)|
00000020  20 31 73 74 20 67 69 74  20 63 6f 6d 6d 69 74 1b  | 1st git commit.|
00000030  5b 4b 0a 72 65 6d 6f 74  65 3a 20 1b 5b 4b 0a 72  |[K.remote: .[K.r|
00000040  65 6d 6f 74 65 3a 20 1b  5b 4b 0a 72 65 6d 6f 74  |emote: .[K.remot|
00000050  65 3a 20 1b 5b 4b 0a 72  65 6d 6f 74 65 3a 20 1b  |e: .[K.remote: .|
00000060  5b 4b 0a 72 65 6d 6f 74  65 3a 20 1b 5b 4b 0a 72  |[K.remote: .[K.r|
00000070  65 6d 6f 74 65 3a 20 43  75 72 72 65 6e 74 20 62  |emote: Current b|
00000080  72 61 6e 63 68 20 6d 61  73 74 65 72 20 69 73 20  |ranch master is |
00000090  75 70 20 74 6f 20 64 61  74 65 2e 1b 5b 4b 0a     |up to date..[K.|
0000009f

Видно, что git здесь добавляет последовательность 0x1b 0x5b 0x4b до окончания строки (0x0a).

Обратите внимание: если вы можете сопоставить 0x1b с буквальный формат \x1b в sed, вы НЕ МОЖЕШЬ сделать то же самое для 0x5b, который представляет левую квадратную скобку [:

$ cat chartest.txt | sed 's/\x1b\x5b//g' | hexdump -C
sed: -e expression #1, char 13: Invalid regular expression

Возможно, вы можете избежать представления с дополнительной обратной косой чертой \ - который заканчивается как \\x5b; но в то время как это «проходит» - это не соответствует чему-либо, как предполагалось:

$ cat chartest.txt | sed 's/\x1b\\x5b//g' | hexdump -C
00000000  72 65 6d 6f 74 65 3a 20  2a 20 32 37 36 32 35 61  |remote: * 27625a|
00000010  38 20 28 48 45 41 44 2c  20 6d 61 73 74 65 72 29  |8 (HEAD, master)|
00000020  20 31 73 74 20 67 69 74  20 63 6f 6d 6d 69 74 1b  | 1st git commit.|
00000030  5b 4b 0a 72 65 6d 6f 74  65 3a 20 1b 5b 4b 0a 72  |[K.remote: .[K.r|
00000040  65 6d 6f 74 65 3a 20 1b  5b 4b 0a 72 65 6d 6f 74  |emote: .[K.remot|
...

Итак, если вы хотите совместить этот символ, очевидно, вы должны записать его как скрытое влево квадратная скобка, то есть \[ - остальные значения могут быть введены с экранированной записью \x:

$ cat chartest.txt | sed 's/\x1b\[\x4b//g' | hexdump -C
00000000  72 65 6d 6f 74 65 3a 20  2a 20 32 37 36 32 35 61  |remote: * 27625a|
00000010  38 20 28 48 45 41 44 2c  20 6d 61 73 74 65 72 29  |8 (HEAD, master)|
00000020  20 31 73 74 20 67 69 74  20 63 6f 6d 6d 69 74 0a  | 1st git commit.|
00000030  72 65 6d 6f 74 65 3a 20  0a 72 65 6d 6f 74 65 3a  |remote: .remote:|
00000040  20 0a 72 65 6d 6f 74 65  3a 20 0a 72 65 6d 6f 74  | .remote: .remot|
00000050  65 3a 20 0a 72 65 6d 6f  74 65 3a 20 0a 72 65 6d  |e: .remote: .rem|
00000060  6f 74 65 3a 20 43 75 72  72 65 6e 74 20 62 72 61  |ote: Current bra|
00000070  6e 63 68 20 6d 61 73 74  65 72 20 69 73 20 75 70  |nch master is up|
00000080  20 74 6f 20 64 61 74 65  2e 0a                    | to date..|
0000008a
1
ответ дан sdaau 19 August 2018 в 01:32
поделиться

Команда ansi2txt (часть пакета kbtin), похоже, отлично выполняет работу над Ubuntu.

8
ответ дан soorajmr 19 August 2018 в 01:32
поделиться
  • 1
    Таким образом, ansi2txt, похоже, не выделяет жирные буквы, тогда как ответ с использованием col -b, указанный ниже (извращенно), делает. Вот пример, чтобы продемонстрировать это: diff <(man -Tutf8 tmux | col -b | head | hd) <(man -Tutf8 tmux | ansi2txt | head | hd) – Att Righ 8 March 2017 в 16:27
  • 2

Вы ищете ansifilter ?


Две вещи, которые вы можете сделать: введите литеральный выход (в bash:)

Использование ввода клавиатуры:

sed 's / Ctrl-vEsc // g '

альтернативно

sed' s / Ctrl-vCtrl - [// g '

Или вы можете использовать символы escapes:

sed 's/\x1b//g'

или для всех управляющих символов :

sed 's/[\x01-\x1F\x7F]//g' # NOTE: zaps TAB character too!
33
ответ дан the Tin Man 19 August 2018 в 01:32
поделиться

commandlinefu дает правильный ответ , который разделяет цвета ANSI, а также команды перемещения:

sed "s,\x1B\[[0-9;]*[a-zA-Z],,g"
6
ответ дан Tom Hale 19 August 2018 в 01:32
поделиться
  • 1
    Это работает с gnu sed, но не переносится на другие реализации sed (например, bsd) - из-за \ x1B. Для других seds вы можете использовать необработанный escape-символ (вы можете использовать префикс ctrl-v для вставки символа escape-символа в командной строке). – Juan 6 March 2018 в 17:24
Другие вопросы по тегам:

Похожие вопросы: