Puncte:0

sed cu scăpările de culoare ANSI eșuează

drapel in

Nu știu de ce nu funcționează:

echo -e "$(echo "Acesta este un text necolorat" | sed "s/{Acesta este un text necolorat}/{Acesta este un \033[0;34text necolorat\033[0m}/g")"

dar asta merge bine:

echo „$(echo „Hello World” | sed „s/Hello/Hi/g”)”

Poți să-mi explici?

Bodo avatar
drapel pt
Vă rugăm [editați] întrebarea dvs. și explicați ce anume vrei să spui cu „acest lucru nu funcționează”. Ce ieșire reală obțineți? Ce vrei să obții?
Bruno Henrique Peixoto avatar
drapel in
Următoarea comandă: start_command echo „acesta este un text necolorat” | sed 's/Acesta este un text necolorat/Acesta este un \033\[0;34muncolored text\033\[0m/g' end_commend încă nu funcționează
Bruno Henrique Peixoto avatar
drapel in
Ai putea lipi rezultatul final. Nu îl înțeleg doar înlocuind ```[``` cu ```\[```
Bruno Henrique Peixoto avatar
drapel in
Problema originală ia un șir necolorat și îl înlocuiește cu unul colorat. Cu toate acestea, după cum puteți vedea, versiunea colorată nu are unele bare oblice inverse.
Bruno Henrique Peixoto avatar
drapel in
Problema rezolvata!
Puncte:2
drapel hr

Există o serie de probleme.

În primul rând, bretele {...} în expresia ta sed nu se potrivesc cu nimic din intrare. Într-o expresie regulată de bază sed, acoladele sunt literale, în timp ce într-o expresie regulată extinsă ele înconjoară un cuantificator de formă {n,m}. Ele nu sunt niciodată folosite pentru grupare.

În al doilea rând, secvența ta de culori este defectă - deschiderea trebuie să fie \033[0;34m Decat \033[0;34

În al treilea rând, caracterul backslash \ este special în sed - în special, o bară oblică inversă urmată de o cifră zecimală pe RHS a unei substituții este o referință inversă la un grup de captură; cel puțin în GNU sed, \0 se referă la întregul LHS capturat echivalent cu jetonul special de înlocuire & deci de exemplu

$ echo foo | sed 's/foo/\033bar/'
foo33bar

A trece un literal \ spre exterior ecou -e ai avea nevoie \\ în interiorul șirului de înlocuire a sedului.

In cele din urma, \ este de asemenea special pentru shell, așa că în interiorul ghilimele duble „soft” au nevoie de o bară oblică inversă suplimentară. Deci fie:

echo -e „$(echo „Acesta este un text necolorat” | 
  sed "s/Acesta este un text necolorat/Acesta este un \033[0;34muncolored text\033[0m/")"

sau (înlocuind ghilimelele interioare cu ghilimele simple „puternice”):

echo -e „$(echo „Acesta este un text necolorat” | 
  sed 's/Acesta este un text necolorat/Acesta este un \033[0;34muncolored text\033[0m/')"

Rețineți că nu aveți nevoie de g modificator pentru a face o singură înlocuire pe linie.

Vezi si Ce caractere trebuie să evadez când folosesc sed într-un script sh?

Bruno Henrique Peixoto avatar
drapel in
Mi-am făcut drumul spre ieșire. Aruncă o privire la răspunsul de mai jos.
Puncte:0
drapel in

Soluția mea elaborată:

#!/bin/bash

colored_text='acesta este un \033[0;34mtext\033[0m'
uncolored_text='acesta este un text'

printf %b\n "$(sed "s/$text_necolorat/$text_colorat/" <<< "$text_necolorat")"

Bruno Henrique Peixoto avatar
drapel in
Mulțumesc, bac0n! Miroase bine.

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.