Thread View: pl.comp.os.linux
6 messages
6 total messages
Started by heby
Fri, 20 Jan 2023 10:52
Podmiana odwrotna zmiennych
Author: heby
Date: Fri, 20 Jan 2023 10:52
Date: Fri, 20 Jan 2023 10:52
31 lines
1866 bytes
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
Author: heby
Date: Fri, 20 Jan 2023 11:05
Date: Fri, 20 Jan 2023 11:05
4 lines
1181 bytes
1181 bytes
On 20/01/2023 11:52, heby wrote: > bo grepami można łatwo i powoli Tfu, sedami ;)
Re: Podmiana odwrotna zmiennych
Author: 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
Re: Podmiana odwrotna zmiennych
Author: Jacek Marcin Jaworski
Date: Mon, 23 Jan 2023 17:08
Date: Mon, 23 Jan 2023 17:08
1 lines
1355 bytes
1355 bytes
Napisz ile jest to stówek ten gotowiec i będzie.
Re: Podmiana odwrotna zmiennych
Author: heby
Date: Wed, 25 Jan 2023 08:37
Date: Wed, 25 Jan 2023 08:37
29 lines
2389 bytes
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
Author: heby
Date: Wed, 25 Jan 2023 08:38
Date: Wed, 25 Jan 2023 08:38
6 lines
1400 bytes
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