Программа, которая передает STDIN STDOUT с разделенными цветовыми кодами?

Можно отменить “владение” программы от оболочки с disown встроенный:

# press Ctrl+Z to suspend the program
bg
disown

Однако это только говорит оболочке не отправлять a SIGHUP предупредите к программе, когда оболочка выйдет. Программа сохранит любое соединение, которое она имеет с терминалом, обычно как стандартный вход, потоки вывода и потоки сообщений об ошибках. Нет никакого способа повторно прикрепить тех, которые к другому терминалу. (Экранные работы путем эмуляции терминала для каждого окна, таким образом, программы присоединены к экранному окну.)


Возможно повторно прикрепить filedescriptors к другому файлу путем присоединения программы в отладчике (т.е. использование ptrace) и то, чтобы заставлять это звонить open, dup и close. Существует несколько инструментов, которые делают это; это - хитрый процесс, и иногда они будут разрушать процесс вместо этого. Возможности включают (ссылки, собранные от ответов до того, Как я могу отрицать рабочий процесс и связать его к новой экранной оболочке? и Могу я nohup/screen уже запущенный процесс?):

65
04.12.2010, 01:00
5 ответов

Вы думали бы, что будет утилита для этого, но я не мог найти его. Однако эта острота Perl должна добиться цели:

perl -pe 's/\e\[?.*?[\@-~]//g'

Пример:

$ command-that-produces-colored-output | perl -pe 's/\e\[?.*?[\@-~]//g' > outfile

Или, если Вы хотите сценарий, можно сохранить как stripcolorcodes:

#! /usr/bin/perl

use strict;
use warnings;

while (<>) {
  s/\e\[?.*?[\@-~]//g; # Strip ANSI escape codes
  print;
}

Если Вы хотите разделить только цветовые коды и оставить какие-либо другие коды ANSI (как перемещение курсора) одними, использовать

s/\e\[[\d;]*m//g;

вместо замены я использовал выше (который удаляет все управляющие коды ANSI).

60
27.01.2020, 19:32

Удалите цветовые коды (специальные символы) с GNU sed

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"

Или

Разделите escape-последовательности ANSI в Python

Установите colorama пакет Python (pip install colorama). Помещенный в stripcolorcodes:

#!/usr/bin/env python
import colorama, fileinput, sys;
colorama.init(strip=True);

for line in fileinput.input():
    sys.stdout.write(line)

Выполненный chmod +x stripcolorcodes.

29
27.01.2020, 19:32
  • 1
    Это является потрясающим. Точно, в чем я нуждался! –  adivis12 08.04.2016, 18:06
  • 2
    Python является немного медленным, но sed впечатляющее Примечание :) –   17.11.2017, 10:23
  • 3
    Не попробовал Python, но sed версия не разделяет все цвета. (Я не протестировал исчерпывающе, но это оставило некоторые цвета фона неповрежденными, таким образом, я пошел с более быстрой опцией жемчуга.) –  rsaw 18.01.2018, 01:48

Если можно установить Термин:: модуль ANSIColor, этот сценарий жемчуга работы:

#!/usr/bin/env perl
use Term::ANSIColor qw(colorstrip);
print colorstrip $_ while <>;
22
27.01.2020, 19:32
  • 1
    Это на самом деле, где я получил тот единственный цветовыми кодами regex. Но устанавливая целый модуль только, для которого regex является слишком. –  cjm 04.12.2010, 04:00
  • 2
    Meh при установке cpanm правильно он устанавливает модуль приблизительно за 5 секунд. –  Ryan C. Thompson 04.12.2010, 11:30
[118739]Эта команда sed сделала это для меня:

Пример:

3
27.01.2020, 19:32

Если система имеет доступ к NodeJS, то можно установить следующий пакет Node, strip-ansi-cli.

$ npm install -g strip-ansi-cli

Затем вы можете выполнить свою команду так:

$ command-that-produces-colored-output | strip-ansi > outfile
10
27.01.2020, 19:32

Теги

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