Sprawdzanie wyniku z
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";'
w edytorze tekstów (np. vi
) pokazuje:
^[[37mABC
^[[0m
Jak usunąć kody kolorów ANSI z pliku wyjściowego? Podejrzewam, że najlepszym sposobem byłoby przepuszczenie danych wyjściowych przez swego rodzaju edytor strumieni.
Poniższe nie działa
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' | perl -pe 's/\^\[\[37m//g' | perl -pe 's/\^\[\[0m//g'
more
lubless -R
które mogą interpretować kody specjalne jako kolory zamiast edytora tekstu.Odpowiedzi:
Znaki
^[[37m
i^[[0m
są częścią sekwencji ucieczkowych ANSI (kody CSI) . Zobacz także te specyfikacje .Korzystanie z GNU
sed
\x1b
(lub\x1B
) jest specjalnym znakiem ucieczki(
sed
nie obsługuje alternatyw\e
i\033
)\[
jest drugim znakiem sekwencji ucieczki[0-9;]*
to wyrażenia regularne wartości kolorum
jest ostatnim znakiem sekwencji ucieczki⚠ na MacOS, domyślne
sed
polecenie nie obsługuje znaków specjalnych, takich jak\e
jak podkreślił SLM i steamer25 w komentarzach. Zamiastgsed
tego użyj , że możesz zainstalować za pomocąbrew install gnu-sed
.Przykład z linią poleceń OP : (OP oznacza Plakat oryginalny)
Tom Hale sugeruje usunięcie wszystkich innych sekwencji ucieczki, używając
[a-zA-Z]
zamiast literym
specyficznej dla sekwencji ucieczki trybu graficznego (koloru). Ale[a-zA-Z]
może być zbyt szeroki i może usunąć zbyt wiele. Michał Faleński i Miguel Mota proponują usunięcie tylko niektórych sekwencji ucieczki za pomocą odpowiednio[mGKH]
i[mGKF]
. Britton Kerin wskazuje, żeK
należy również użyćm
do usunięcia kolorów zgcc
błędu / ostrzeżenia (nie zapomnij przekierowaćgcc 2>&1 | sed...
).Za pomocą
perl
Wersja
sed
zainstalowana w niektórych systemach operacyjnych może być ograniczona (np. MacOS).perl
Zaletą tego polecenia jest to, że ogólnie łatwiej jest je zainstalować / zaktualizować w większej liczbie systemów operacyjnych. Adam Katz sugeruje użycie\e
(takiego samego jak\x1b
) w PCRE .Wybierz wyrażenie regularne w zależności od liczby poleceń, które chcesz filtrować:
Przykład z linią poleceń OP:
Stosowanie
Jak wskazał komentarz Stuarta Cardalla , ten
sed
wiersz poleceń jest używany w projekcie Ultimate Nginx Bad Bot (1000 gwiazdek) do czyszczenia raportu e-mail ;-)źródło
sed
polecenie i wyjaśnienie. :)1;31m
Więc lepiej dodaj;
do wyrażenia regularnego:cat colored.log | sed -r 's/\x1b\[[0-9;]*m//g'
inaczej nie zostaną usunięte.sed
nie działała z pokazanym przykładem,gsed
jednak wersja działa.brew install gnu-sed
.Znalazłem lepsze narzędzie do usuwania sekwencji ucieczki. Sprawdź to:
perl -pe 's/\x1b\[[0-9;]*[mG]//g'
źródło
sed -r
ale NIE.Co jest wyświetlany jako
^[
to nie^
a[
; jest toESC
znak ASCII , utworzony przez Esclub Ctrl[(^
notacja oznacza klawisz Ctrl).ESC
ma wartość szesnastkową 0x1B lub ósemkową 033, więc musisz użyć\x1B
lub\033
w wyrażeniach regularnych :źródło
Jeśli wolisz coś prostego, możesz użyć modułu strip-ansi ( wymagany Node.js ):
Następnie użyj go w następujący sposób:
Lub po prostu podaj ciąg:
źródło
cat
( UUOC ) - powinno być możliwe zrobieniestrip-ansi colors.o
przynajmniejstrip-ansi < colors.o
.strip-ansi < colors.o
, ale z doświadczenia ludzie są bardziej zaznajomieni z rurociągami. Zaktualizowałem odpowiedź.Commandlinefu daje odpowiedź, która usuwa kolory ANSI, a także polecenia ruchu:
Tylko kolory chcesz:
źródło
Pytanie „odpowiedziano” nie działało dla mnie, dlatego stworzyłem to wyrażenie regularne, aby usunąć sekwencje specjalne utworzone przez moduł perl Term :: ANSIColor.
Wyrażenie regularne Grawity powinno działać poprawnie, ale użycie + wydaje się również działać dobrze.
źródło
The "answered" question
? Masz na myśli zaakceptowaną odpowiedź? (2) To polecenie nie działa - nawet się nie wykonuje - ponieważ ma niedopasowaną (niezrównoważoną) ofertę. (3) To bezużyteczne użyciecat
( UUOC ) - powinno być możliwe . (4) Kto powiedział coś o kodach znajdujących się w pliku?perl -pe
command
colors.o
.o
Uważam, że jest to wiarygodne usunięcie wszystkich sekwencji ucieczki ANSI :
(Należy pamiętać, że Perl, podobnie jak wiele innych języków (ale nie sed), przyjmuje
\e
jako znak ucieczki Esc,\x1b
lub\033
za pomocą kodu, jak pokazano na terminalach^[
. Używam go tutaj, bo wydaje się bardziej intuicyjne.)To polecenie perla, które możesz uruchomić wszystkie w jednym wierszu, jeśli wolisz, zawiera cztery zastępstwa:
Pierwszy dotyczy sekwencji CSI (sekwencji kodu ucieczki rozpoczynających się od „Control Sequence Introducer” z Esc[, który obejmuje znacznie więcej niż sekwencje Select Graphic Rendition, które składają się z kodów kolorów i innych dekoracji tekstowych).
Druga zamiana usuwa pozostałe sekwencje zawierające końcowe znaki i kończy się na ST (String Terminator, Esc\). Trzecia wymiana to samo, ale również pozwala na polecenie systemu operacyjnego sekwencje do końca z BEL (
\x07
,\007
często\a
).Czwarta zamiana usuwa pozostałe ucieczki.
Rozważ także usunięcie innych znaków ASCII o zerowej szerokości, takich jak BEL i innych bardziej niejasnych znaków kontrolnych C0 i C1 . Używam
s/[\x00-\x1f\x7f-\x9f\xad]+//g
, w tym także Usuń i Łagodny łącznik . Wyklucza to kodowane wyżej znaki Unicode o zerowej szerokości, ale uważam, że jest to wyczerpujące dla ASCII (Unicode\x00
-\xff
). Jeśli to zrobisz, usuń je na końcu, ponieważ mogą być zaangażowane w dłuższe sekwencje.źródło
„tput sgr0” pozostawił ten znak kontrolny ^ (B ^ [
Oto zmodyfikowana wersja, aby się tym zająć.
źródło
tput sgr0
, czego inne rozwiązania nigdy nie wydają się być w stanie się pozbyć.Miałem podobny problem z usuwaniem postaci dodawanych z kolekcjonowania interaktywnego górnego wyjścia za pomocą szpachli, co pomogło:
źródło
cat
( UUOC ) - powinno być możliwe .perl -pe
command
putty1.log
To działało dla mnie (testowane na Mac OS X)
źródło