Mam skrypt, który generuje dane wyjściowe z kolorami i muszę usunąć kody ANSI.
#!/bin/bash
exec > >(tee log) # redirect the output to a file but keep it on stdout
exec 2>&1
./somescript
Dane wyjściowe (w pliku dziennika):
java (pid 12321) is running...@[60G[@[0;32m OK @[0;39m]
Nie wiedziałem, jak umieścić tutaj znak ESC, więc umieściłem go @
w tym miejscu.
Zmieniłem skrypt na:
#!/bin/bash
exec > >(tee log) # redirect the output to a file but keep it on stdout
exec 2>&1
./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
Ale teraz daje mi (w pliku dziennika):
java (pid 12321) is running...@[60G[ OK ]
Jak mogę to również usunąć @[60G
?
Może jest sposób na całkowite wyłączenie kolorowania dla całego skryptu?
strip-ansi
: github.com/chalk/strip-ansi .Odpowiedzi:
Według Wikipedii ,
[m|K]
wsed
komendzie używasz jest specjalnie zaprojektowany do rączkim
(polecenie) i kolorK
(na „części” kasowania linii poleceń). Twój skrypt próbuje ustawić bezwzględną pozycję kursora na 60 (^[[60G
), aby uzyskać wszystkie OK w wierszu, któregosed
nie obejmuje twoja linia.(Prawidłowo,
[m|K]
prawdopodobnie powinno być(m|K)
lub[mK]
, ponieważ nie próbujesz dopasować znaku pionowej kreski. Ale to nie jest teraz ważne).Jeśli zmienisz ostatnie dopasowanie w poleceniu na
[mGK]
lub(m|G|K)
, powinieneś być w stanie złapać tę dodatkową sekwencję sterującą.źródło
brew install gnu-sed
zainstaluje odpowiednią wersję. Biegnij zgsed
.echo "$(tput setaf 1)foo$(tput sgr0) bar" | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | cat -A
, otrzymam:foo^O bar$
Więc wydaje mi się , że niektóre znaki nie są poprawnie usunięte, prawda? Czy wiesz, jak poprawić?setaf
obsługuje) wymagają więcej parametrów niż tylko dwa; moje wyrażenie regularne obsługuje dwa. Zmiana pierwszego?
wyjścia na*
powinna pomóc. Obsługasgr0
jest możliwa, ale w oparciu o wyszukiwanie prawdopodobnie wykracza poza zakres tej hakerskiej odpowiedzi opartej na wyrażeniach regularnych.sed
do potoku znak „shift in”[38;5;45m
). Ta alternatywna odpowiedź działa unix.stackexchange.com/a/55547/168277Nie mogłem uzyskać przyzwoitych wyników z żadną z pozostałych odpowiedzi, ale zadziałały u mnie następujące:
Gdybym tylko usunął znak kontrolny „^ [”, pozostawił on resztę danych koloru, np. „33m”. Dołączenie kodu koloru i „m” załatwiło sprawę. Zastanawiam się, że s / \ x1B // g nie działa, ponieważ \ x1B [31m z pewnością działa z echem.
źródło
-E
zamiast-r
rozszerzonego wyrażenia regularnego. Więcej można znaleźć tutaj{1,3}
na{,3}
(w przeciwnym razie nadal pomijał niektóre elementy sterujące), dzięki za rozwiązanie!sed -r "s/[[:cntrl:]]\[([0-9]{1,3};)*[0-9]{1,3}m//g"
IMHO, większość tych odpowiedzi zbyt mocno próbuje ograniczyć zawartość kodu ucieczki. W rezultacie brakuje im wspólnych kodów, takich jak
[38;5;60m
(kolor ANSI pierwszego planu 60 z trybu 256 kolorów).Wymagają również
-r
opcji, która włącza rozszerzenia GNU . Nie są one wymagane; po prostu poprawiają odczyt wyrażenia regularnego.Oto prostsza odpowiedź, która obsługuje 256-kolorowe znaki ucieczki i działa w systemach bez GNU
sed
:Spowoduje to wyłapanie wszystkiego, co zaczyna się od
[
, ma dowolną liczbę miejsc dziesiętnych i średników, a kończy się literą. Powinno to wychwycić wszystkie typowe sekwencje specjalne ANSI .Dla zabawy, oto większe i bardziej ogólne (ale minimalnie przetestowane) rozwiązanie dla wszystkich możliwych sekwencji ucieczki ANSI :
(a jeśli masz problem z SI @ edi9999, dodaj
| sed "s/\x0f//g"
na końcu; działa to dla każdego znaku kontrolnego , zastępując0f
heksadecymalnym znakiem)źródło
|
w sedzie,]
wewnątrz klasy znaków w sedzie oraz'
w łańcuchu bash z pojedynczym cudzysłowem. Teraz pracuje dla mnie w bardzo podstawowym przypadku testowym.W przypadku systemu Mac OSX lub BSD
źródło
-E
flagę sed, aby włączyć rozszerzone wyrażenie regularne .Miałem też problem, że czasami pojawiała się postać SI.
Stało się tak np. Z tym wejściem:
echo "$(tput setaf 1)foo$(tput sgr0) bar"
Oto sposób na usunięcie znaku SI (przesunięcie) (0x0f)
źródło
Hmm, nie jestem pewien, czy to zadziała, ale 'tr' usunie '(usunie) kody kontrolne - spróbuj:
źródło
rwxr-xr-x 1 tokra admin 22 Oct 18 14:21 [0m[01;36m/usr/local/opt/gradle[0m -> [01;34m../Cellar/gradle/4.2.1[0m/
Miałem podobny problem. Wszystkie znalezione przeze mnie rozwiązania działały dobrze w przypadku kodów kolorów, ale nie usunęły znaków dodanych przez
"$(tput sgr0)"
(resetowanie atrybutów).Biorąc na przykład rozwiązanie w komentarzu davemyrona, długość wynikowego ciągu w poniższym przykładzie wynosi 9, a nie 6:
Aby poprawnie działało, wyrażenie regularne musiało zostać rozszerzone, aby pasowało również do sekwencji dodanej przez
sgr0
(„\E(B
”):źródło
O wiele prostsza funkcja w czystym Bash do odfiltrowywania typowych kodów ANSI ze strumienia tekstowego:
Widzieć:
źródło
tldr
. (Chociaż używam zsh, więc może to być również z tego powodu).extglob
ani prawdopodobnie nie zrozumie całkowicie zastępowania ciągów.sed
wspomnianych tutaj, które będą działać z Zsh.Rozwiązanie @ jeff-bowman pomogło mi pozbyć się NIEKTÓRYCH kodów kolorów. Dodałem kolejną małą porcję do wyrażenia regularnego, aby usunąć więcej:
źródło
Oto czyste rozwiązanie Bash.
Zapisz jako
strip-escape-codes.sh
, utwórz plik wykonywalny, a następnie uruchom<command-producing-colorful-output> | ./strip-escape-codes.sh
.Zauważ, że usuwa to wszystkie kody / sekwencje ucieczki ANSI. Jeśli chcesz się rozebrać tylko kolory, wymienić
[a-zA-Z]
się"m"
.Bash> = 4,0:
Bash <4,0:
źródło
Kontrowersyjnym pomysłem byłaby rekonfiguracja ustawień terminala dla tego środowiska procesu, aby powiadomić proces, że terminal nie obsługuje kolorów.
TERM=xterm-mono ./somescript
Przychodzi mi do głowy coś takiego . YMMV z twoim konkretnym systemem operacyjnym i zdolnością twojego skryptu do zrozumienia ustawień kolorów terminala.źródło
To działa dla mnie:
źródło
somescript
zostanie wdrożone. Może, ale nie musi, rozpoznać, że jego standardowe wyjście to tty. (Słowa „przestępcy” w rzeczywistości trwale wprowadzają do programu kody ucieczki specyficzne dla terminala i strasznie się łamią, gdy są używane na innych terminalach lub w skryptach).