GNU/Linux >> Znalost Linux >  >> Linux

Odebrání řídicích znaků (včetně kódů konzole / barev) z výstupu skriptu?

Mohu použít příkaz „script“ k záznamu interaktivní relace na příkazovém řádku. To však zahrnuje všechny řídicí znaky a barevné kódy. Mohu odstranit řídicí znaky (jako backspace) pomocí „col -b“, ale nemohu najít jednoduchý způsob, jak odstranit barevné kódy.

Všimněte si, že chci používat příkazový řádek normálním způsobem, takže tam nechci deaktivovat barvy – chci je pouze odstranit z výstupu skriptu. Také vím, že si mohu pohrát a zkusit najít regexp, abych věci napravil, ale doufám, že existuje jednodušší (a spolehlivější – co když existuje kód, o kterém při vývoji regulárního výrazu nevím?) řešení.

Pro zobrazení problému:

spl62 tmp: script
Script started, file is typescript
spl62 lepl: ls
add-licence.sed  build-example.sh  commit-test         push-docs.sh
add-licence.sh   build.sh          delete-licence.sed  setup.py
asn              build-test.sh     delete-licence.sh   src
build-doc.sh     clean             doc-src             test.ini
spl62 lepl: exit
Script done, file is typescript
spl62 tmp: cat -v typescript
Script started on Thu 09 Jun 2011 09:47:27 AM CLT
spl62 lepl: ls^M
^[[0m^[[00madd-licence.sed^[[0m  ^[[00;32mbuild-example.sh^[[0m  ^[[00mcommit-test^[[0m         ^[[00;32mpush-docs.sh^[[0m^M
^[[00;32madd-licence.sh^[[0m   ^[[00;32mbuild.sh^[[0m          ^[[00mdelete-licence.sed^[[0m  ^[[00msetup.py^[[0m^M
^[[01;34masn^[[0m              ^[[00;32mbuild-test.sh^[[0m     ^[[00;32mdelete-licence.sh^[[0m   ^[[01;34msrc^[[0m^M
^[[00;32mbuild-doc.sh^[[0m     ^[[00;32mclean^[[0m             ^[[01;34mdoc-src^[[0m             ^[[00mtest.ini^[[0m^M
spl62 lepl: exit^M

Script done on Thu 09 Jun 2011 09:47:29 AM CLT
spl62 tmp: col -b < typescript 
Script started on Thu 09 Jun 2011 09:47:27 AM CLT
spl62 lepl: ls
0m00madd-licence.sed0m  00;32mbuild-example.sh0m  00mcommit-test0m         00;32mpush-docs.sh0m
00;32madd-licence.sh0m   00;32mbuild.sh0m          00mdelete-licence.sed0m  00msetup.py0m
01;34masn0m              00;32mbuild-test.sh0m     00;32mdelete-licence.sh0m   01;34msrc0m
00;32mbuild-doc.sh0m     00;32mclean0m             01;34mdoc-src0m             00mtest.ini0m
spl62 lepl: exit

Script done on Thu 09 Jun 2011 09:47:29 AM CLT

Přijatá odpověď:

Následující skript by měl odfiltrovat všechny řídicí sekvence ANSI/VT100/xterm pro (na základě ctlseq). Minimálně testováno, nahlaste prosím jakoukoli nedostatečnou nebo nadměrnou shodu.

#!/usr/bin/env perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
    s/ e[ #%()*+-./]. |
       e[ [ -?]* [@-~] | # CSI ... Cmd
       e] .*? (?:e\|[ax9c]) | # OSC ... (ST|BEL)
       e[P^_] .*? (?:e\|x9c) | # (DCS|PM|APC) ... ST
       e. //xg;
    print;
}

Známé problémy:

  • Nestěžuje si na chybně tvarované sekvence. K tomu tento skript není.
  • Víceřádkové řetězcové argumenty pro DCS/PM/APC/OSC nejsou podporovány.
  • Bajty v rozsahu 128–159 lze analyzovat jako řídicí znaky, i když se to používá zřídka. Zde je verze, která analyzuje řídicí znaky jiné než ASCII (v některých kódováních, včetně UTF-8, dojde k porušení textu jiného než ASCII).
#!/usr/bin/env perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
    s/ e[ #%()*+-./]. |
       (?:e[|x9b) [ -?]* [@-~] | # CSI ... Cmd
       (?:e]|x9d) .*? (?:e\|[ax9c]) | # OSC ... (ST|BEL)
       (?:e[P^_]|[x90x9ex9f]) .*? (?:e\|x9c) | # (DCS|PM|APC) ... ST
       e.|[x80-x9f] //xg;
    print;
}

Linux
  1. Zjistit, zda je klávesa stisknuta ze skriptu?

  2. Odkud se spouští skript Shell?

  3. Odstranění redundance z výstupních sloupců?

  1. Spuštění skriptu Python z PHP

  2. Zachyťte vstup a výstup z konkrétního spustitelného souboru

  3. grep výstup z dlouhého na široký

  1. Zabránění souběžnému spuštění bash skriptu

  2. Linux – Jak používat /dev/fb0 jako konzolu z uživatelského prostoru nebo do ní vysílat text?

  3. Spusťte bash skript z adresy URL