Article View: pl.comp.os.linux
Article #906808Re: Podmiana odwrotna zmiennych
From: marrgol
Date: Sat, 21 Jan 2023 23:10
Date: Sat, 21 Jan 2023 23:10
73 lines
3643 bytes
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-mailReferences:
<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