🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.os.linux
Article #906808

Re: Podmiana odwrotna zmiennych

#906808
From: marrgol
Date: Sat, 21 Jan 2023 23:10
73 lines
3643 bytes
On 20/01/2023 at 11.52, heby wrote:
> Czy jest jakiś gotowiec, który pozwoli mi na taką sztuczkę:
>
> 1) dostanie plik tekstowy na stdin
> 2) każdy ciąg znaków w tym pliku, pasujący do wartości dowolnej zmiennej
> env, zostanie zastapiony tą zmienną env

Tak ogólnie postawionego zadania, bez dodatkowych warunków, raczej nie
da się dobrze wykonać -- trzeba dokładnie ustalić, co chce się uzyskać
z czego, to i napisanie skryptu/programu pewnie okaże się prostsze
(KISS, YAGNI).
Np. czy 'env' to na pewno musi być całe środowisko, w którym uruchomimy
skrypt, czy może wystarczyłby określony zbiór zmiennych potrzebnych
do uzyskania zamierzonego rezultatu?
Czy w obecności zmiennej 'AUDIO=pa' na pewno chcemy ze 'spam' uzyskać
's$AUDIOm' (albo raczej s${AUDIO}m, żeby to w ogóle miało sens)?
Czy przy zmiennych A=/home/foo i B=/foo/bar z '/home/foo/bar/go.txt'
chcemy otrzymać '$A/bar/go.txt' czy może '/home$B/go.txt'?
Czy przy A=/home/foo i B=/home/foo/bar z '/home/foo/bar/go.txt'
chcemy otrzymać '$A/bar/go.txt' czy może '$B/go.txt'?
Itd, itp…

> 3) wypluje output na stdout
> 
> Czyli chodzi i operację odwrotną, do podstawiania wartości zmiennych. Ja
> chcę dostać zmienne, zamiast wartości.
> 
> Po co?
> 
> Mam loga z kompilacji, mniej więcej takiego:
> 
> /home/foo/bar/spam/src/go.txt
> /home/foo/bar/spam/src/buzz/main.c
> 
> A chcę dostac, w obecności zmiennej środowiskowej
> SRC=/home/foo/bar/spam/src
> 
> ... nastepujący output:
> 
> $SRC/go.txt
> $SRC/buzz/main.c
> 
> Lub podobny, zamieniający wartosci na zmienne symboliczne.
> 
> Mogę go napisac, ale to nie jest wbrew pozorom łatwe (tzn aby zrobić
> to wydajnie, bo grepami można łatwo i powoli.

Łatwe czy nie, to pojęcie raczej względne… :-)  Np. zakładając,
że sprawdzamy całe środowisko, ale pomijamy definicje funkcji
i puste zmienne, i podstawiamy nazwę pierwszej napotkanej
pasującej zmiennej tylko na początku linii z logu, rezultat
taki jak w  powyższym przykładzie można uzyskać takim krótkim
(czytaj: łatwym i wydajnym ;-)) skryptem w perlu:

while(<>) {
   foreach $K (keys %ENV) {
     unless ($ENV{$K} =~ "{" or $ENV{$K} eq "") {
       s/$ENV{$K}/\${$K}/, last if (/^$ENV{$K}/);
     }
   }
   print;
}

No ale bez znajomości wszystkich „a co w przypadku, gdy” to tylko
taka luźna, uproszczona propozycja -- może wystarczy, a może nie.

 > Ktoś coś widział w ten deseń?

Znalezienie gotowca jest MZ mało prawdopodobne.


-- 
mrg
Technical Details
Message-ID: <tqhrd3$2pm2c$1@dont-email.me>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erje.net!feeder.erje.net!weretis.net!feeder8.news.weretis.net!eternal-september.org!reader01.eternal-september.org!.POSTED!not-for-mail
References: <tqdrp3$218q1$1@dont-email.me>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erje.net!feeder.erje.net!weretis.net!feeder8.news.weretis.net!eternal-september.org!reader01.eternal-september.org!.POSTED!not-for-mail
From: marrgol <marrgol@address.invalid>
Newsgroups: pl.comp.os.linux
Subject: Re: Podmiana odwrotna zmiennych
Date: Sun, 22 Jan 2023 00:10:27 +0100
Organization: A noiseless patient Spider
Lines: 73
Message-ID: <tqhrd3$2pm2c$1@dont-email.me>
References: <tqdrp3$218q1$1@dont-email.me>
MIME-Version: 1.0
Injection-Date: Sat, 21 Jan 2023 23:10:27 -0000 (UTC)
Injection-Info: reader01.eternal-september.org; posting-host="14b2c0bbc85ac6fc1fceab2845119a76"; logging-data="2938956"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/0N8S/xR5uQqSKY2bp6pxl"
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.14.0
Cancel-Lock: sha1:iQat/OV5QWvcVf2x0YjCE68RJ0s=
In-Reply-To: <tqdrp3$218q1$1@dont-email.me>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit