🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.os.linux
6 messages
6 total messages Started by heby Fri, 20 Jan 2023 10:52
Podmiana odwrotna zmiennych
#906806
Author: heby
Date: Fri, 20 Jan 2023 10:52
31 lines
1866 bytes
Cześć.

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
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 ;). Ktoś coś widział w ten deseń?
Re: Podmiana odwrotna zmiennych
#906807
Author: heby
Date: Fri, 20 Jan 2023 11:05
4 lines
1181 bytes
On 20/01/2023 11:52, heby wrote:
> bo grepami można łatwo i powoli

Tfu, sedami ;)
Re: Podmiana odwrotna zmiennych
#906808
Author: 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
Re: Podmiana odwrotna zmiennych
#906810
Author: Jacek Marcin Jaworski
Date: Mon, 23 Jan 2023 17:08
1 lines
1355 bytes
Napisz ile jest to stówek ten gotowiec i będzie.
Re: Podmiana odwrotna zmiennych
#906809
Author: heby
Date: Wed, 25 Jan 2023 08:37
29 lines
2389 bytes
On 22/01/2023 00:10, marrgol wrote:
> 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)?

Nie ma. Dlatego na razie nie ograniczam koncepcji narzędzia. Szukam 
czegoś, co łyknie 100MB takiego pliku i zrobi to kilkadziesiąt razy 
dziennie, na kilkunastu zmiennych do podmiany. sedy się nie nadają z 
uwagi na wydajność. A jak coś się znajdzie, to się zobaczy, czy użyteczne.

>> 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;
> }

Tak, mam coś takiego, tylko raczej sed | sed |sed aby wykorzystać 
współbieżność.
Re: Podmiana odwrotna zmiennych
#906811
Author: heby
Date: Wed, 25 Jan 2023 08:38
6 lines
1400 bytes
On 23/01/2023 18:08, Jacek Marcin Jaworski wrote:
> Napisz ile jest to stówek ten gotowiec i będzie.

Przebijam: napiszę taniej, bo w ramach projektu. Ale zanim napiszę, to 
szukam gotowego rozwiązania, bo kwadratowe koła, ale własne, 
niekoniecznie są najlepszą opcją.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads