Użycie sed do pokolorowania wyniku polecenia Solaris


29

Mam skrypt ksh, który musi działać zarówno na systemie Linux, jak i Solaris. Próbuję pokolorować dane wyjściowe określonych poleceń. Działa na Linuksie (konkretnie RHEL6), ale nie na solaris (SunOS 5.10).

Komenda w systemie Linux (wyjściowy „test” ma poprawnie czerwony kolor):

[amartin@linuxbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
test

Polecenie na solaris (wyjściowy „test” nie jest kolorowy):

[amartin@sunbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
x1B[31mtestx1B[0m

Czy istnieje sposób na spreparowanie tego polecenia tak, aby wynik był czerwony, bez surowych kodów na wyjściu? Nie mogę zmienić polecenia „echo”, ponieważ jest to tylko wypełnienie polecenia, które faktycznie wykonuję.

Odpowiedzi:


35

\xNN jest sekwencją ucieczki w GNU sed, ale nie jest standardem, a w szczególności nie jest dostępna w systemie Solaris.

Możesz dołączyć dosłowny znak ucieczki w swoim skrypcie, ale utrudniłoby to czytanie i edycję.

Możesz użyć printfdo wygenerowania znaku ucieczki. Rozumie ucieczki ósemkowe, a nie szesnastkowe.

esc=$(printf '\033')
echo "test" | sed "s,.*,${esc}[31m&${esc}[0m,"

Możesz zadzwonić, tputaby wygenerować tekst zastępczy w wywołaniu sed. To polecenie wyszukuje sekwencje specjalne w bazie danych terminfo . Teoretycznie użycie tputsprawia, że ​​skrypt jest bardziej przenośny, ale w praktyce jest mało prawdopodobne, aby spotkać terminal, który nie używa kodów specjalnych ANSI .

echo "test" | sed "s,.*,$(tput setaf 1)&$(tput sgr0),"

działa to świetnie, aby pokolorować cat |sedzbyt thx!
Aquarius Power

8

Byłoby łatwiejsze w użyciu tput

tput setaf 1; somecommand; tput sgr0

lub

tput setaf 1
somecommand
tput sgr0

To ustawia pierwszy plan na czerwony, przebiegi, somecommandktóre następnie wyświetlą wynik na czerwono, a następnie skasują kolejność kolorów. Działa to przynajmniej z bash, zshi ksh.

Zobacz tmux(1)i terminfo(5)więcej informacji o tym, co możesz zrobić tput.


Dzięki za odpowiedzi. Jak powiedziałem wcześniej, nie mogę zmienić polecenia echa. „echo” to tylko zastępstwo dla procesu, który wywołuję, którego nie mogę zmienić. Czy można w jakiś sposób używać sed z tput? Ponadto po uruchomieniu tego polecenia w systemie sunOS 5.10 nie widzę żadnych kolorów.
acm

Zaktualizowałem go, aby podzielić go na osobne polecenia.
bahamat

Jest to lepsze niż moja obecna implementacja, ponieważ nie drukuje surowych kodów ascii na solaris. Jednak (z jakiegokolwiek powodu) nie zmienia koloru „somecommand” na solaris. Działa na Linuksie. Zaakceptowałem odpowiedź @Gilles, która spełnia oba te warunki. Dziękuję Ci.
acm

0

Niektóre terminale (jak dla mnie bash w iterm) pozwalają ci naciskać klawisze „ctrl-v”, a następnie „ctrl + [”, i wstawi dosłowny znak ucieczki do ciągu wejściowego. Jeśli to zadziała, prawdopodobnie zobaczysz na ekranie znaki „^ [”, ale jeśli przesuniesz kursor wokół niego, potraktuje to jako jedną postać, ponieważ tak naprawdę jest za kulisami.

Aby zrozumieć, co się dzieje (i sprawdzić, czy jest to możliwe), możesz wpisać ctrl + v, a następnie ctrl + i. Powinieneś zobaczyć, że znak tabulacji został wstawiony do ciągu zachęty. Powodem jest historia CS: ale okazuje się, że naprawdę stara klawiatura miała ctrl + ja podłączyłem się, aby wysłać znak tabulatora; a klawisz tab wysyła również ten sam sygnał elektryczny.

Z tego powodu bash dla wielu terminali wciąż interpretuje niektóre kody Ctrl, aby odwzorować te same znaki.

Ctrl + I odwzorowuje znak tabulacji, a ctrl + [zdarza się pasować do znaku ucieczki ascii.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.