Puncte:0

Eliminați secvențele ANSI din șir prin codul bash-python

drapel in

Încerc să folosesc bash pentru a elimina secvențele de evadare de culoare ANSI dintr-un șir fără succes. Am încercat deja un cod bazat pe regex.

#!/bin/bash

Albastru='\033[0;34m' # Albastru
Clear='\033[0m' # Resetare text

removeColors (){
    local uncolored_string =''
    
    local import_row='import re; \n'
    regex local_='(\x9B|\x1B\[)[0-?]*[ -\/]*[@-~]'
    local func_def_row='def escape_ansi(line): \n'
    local ansi_escape_row="ansi_escape=re.compile(r\'$regex_\') \n" 
    local return_row="return ansi_escape.sub('', line) \n"
    local print_row="print escape_ansi(line = '$1')"

    local code="$import_row$func_def_row$ansi_escape_row$return_row$print_row"
    
    echo $(python -c $cod)
}

str="Apăsați ${Blue}orice tastă${Clear} pentru a continua..."
echo -e "$str"

eliminați culorile „$str”

Mai primesc codul de mai jos.

  Fișier „<șir>”, rândul 1
    import
         ^
SyntaxError: sintaxă nevalidă

Ma poti ajuta?

Actualizați:

Am găsit biblioteca python strip-ansi.

removeColors (){
    local uncolored_string =''
    local ansi_snippet="$1"
    
    echo "$(python3 -c "din strip_ansi import strip_ansi; print(strip_ansi(\"$ansi_snippet\"))")"
}

Cu toate acestea, chiar și după ce l-am instalat, primesc eroarea de mai jos:

Traceback (cel mai recent apel ultimul):
  Fișierul „<șir>”, linia 1, în <modul>
ModuleNotFoundError: Niciun modul numit „strip_ansi”
drapel hr
Chiar nu înțeleg ce încercați să faceți aici, totuși veți obține aceeași eroare de la `python -c import`, așa că poate că *prima* problemă este variabila shell necotată `$code`?
Bruno Henrique Peixoto avatar
drapel in
Este foarte mult începutul. Mulțumiri:)
drapel hr
... fwiw Aș sugera să folosiți un document aici pentru chestii de genul acesta, mai degrabă decât să încercați să amestecați totul într-un șir de mai multe linii. Vezi, de exemplu, [Cod hibrid în scripturile shell. Partajarea variabilelor](https://unix.stackexchange.com/questions/74244/hybrid-code-in-shell-scripts-sharing-variables)
pLumo avatar
drapel in
... sau un fișier script separat.
pLumo avatar
drapel in
`\n` nu este luat literal aici. Ai putea folosi `$'...'`. Cu toate acestea, aveți și erori de creștere pentru `ansi_escape_row` și `return_row`. Și probabil și alte probleme. Mai bine nu amestecați codul shell și codul python.
Bruno Henrique Peixoto avatar
drapel in
Am actualizat întrebarea cu ceva progres. Puteți investiga în continuare această enigmă?
pLumo avatar
drapel in
Cum l-ai instalat? Ce versiune `python` returnează `pip -V`. Dacă 2.x, puteți încerca `pip3 install strip_ansi` sau `python3 -m pip install strip_ansi`
Bruno Henrique Peixoto avatar
drapel in
Versiunea Pip: pip 22.0.3 de la $path (python 3.8) pip3 install strip-ansi: Cerință deja îndeplinită: strip-ansi în $LOCAL_PATH
pLumo avatar
drapel in
Btw, de ce nu folosești [`ansi2txt`](https://unix.stackexchange.com/questions/14684/removing-control-chars-including-console-codes-colours-from-script-output/527259# 527259) ?
pLumo avatar
drapel in
Instalați `strip-ansi`, dar utilizați `strip_ansi` cu caracter de subliniere. Documentația are două versiuni diferite ale instrucțiunilor de instalare?!
Bruno Henrique Peixoto avatar
drapel in
Biblioteca ansi2txt părea grozavă, dar nu a funcționat pentru exemplu: echo „$(echo „Apăsați \033[0;34multe taste\033[0m pentru a continua...” | ansi2txt | col -b)” Poți să-l conduci pentru mine, domnule?
pLumo avatar
drapel in
Problema este `echo`, nu se evaluează la coduri ansi. Folosiți `echo -e` sau `printf` și funcționează bine.
Bruno Henrique Peixoto avatar
drapel in
GROZAV! Multumesc domnule. :)
Puncte:1
drapel in

Soluţie: echo -e „$1” | ansi2txt | col -b

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.