Thread View: pl.comp.os.linux.programowanie
3 messages
3 total messages
Started by piecia aka dracorp
Tue, 11 Jan 2011 08:44
[awk]Przekazanie argumentu funkcji do wyrażenia regularnego
Author: piecia aka dracorp
Date: Tue, 11 Jan 2011 08:44
Date: Tue, 11 Jan 2011 08:44
36 lines
2014 bytes
2014 bytes
Witam
Ostatnio wpadł mi taki pomysł żeby użyć awk do kolorowania wyświetlanego
tekstu na ekranie. Wstępnie to wygląda tak:
#v+
#!/bin/bash
off="\033[0m"
kolor1="\033[1;32m"
awk -voff=$off -vkolor1=$kolor1 '
function koloruj (co,kolor) {
if ( kolor == "" ){ kolor = "\033[1;31m"; }
$0 = gensub(co,kolor co off,"g");
#$0 = gensub(/(co)/,kolor "\\1" off,"g"); #to nie działa
}
{ koloruj("false");
koloruj("^[a-z]+:",kolor1);
print
}' < <(getent passwd)
#v-
Chciałem przekazać zmienną do wyrażenia regularnego. Jeśli użyłem
zapisu // w gensub to zmienna jest jako łańcuch, nie jest podstawiana
wartość. Beż użycia // działa prawie dobrze bo dla linii:
#v+
koloruj("^[a-z]+:",kolor1);
#v-
generuje coś takiego:
#v+
^[a-z]+:x:0:0:root:/root:/bin/bash
#v-
Czyli dobrze jest wyszukiwane wyrażenie regularne ale źle jest już
podstawiane. Oczywiście tekst jest kolorowany.
Mógłbym prosić o wyjaśnienie dlaczego tak jest, co robię nie tak?
--
piecia aka dracorp
pisz na: piotr kropka rogoza at wp kropka eu
Re: [awk]Przekazanie argumentu funkcji do wyrażenia regularnego
Author: Michal Jaegermann
Date: Thu, 13 Jan 2011 02:30
Date: Thu, 13 Jan 2011 02:30
35 lines
1999 bytes
1999 bytes
piecia aka dracorp <imie.nazwisko@wp.eu> wrote:
> awk -voff=$off -vkolor1=$kolor1 '
> function koloruj (co,kolor) {
> if ( kolor == "" ){ kolor = "\033[1;31m"; }
> $0 = gensub(co,kolor co off,"g");
> #$0 = gensub(/(co)/,kolor "\\1" off,"g"); #to nie działa
> }
"#to nie działa" bo jeżeli można użyć zmiennej w miejsce wyrażenia
regularnego to zmienne "w środku" takiego wyrażenia nie są postawiane i
to co widać powyżej jest traktowane literalnie. Działa, tyle że robi to
co według dokumentacji powinno. Przykład z funkcją w awk:
function reorder (a, b, re) {
re = "(" a ") (" a ")";
print b
print re, "-->", gensub(re, "\\2 \\1", "g", b)
}
BEGIN {
x = ".+"
y = "abc def"
reorder(x, y)
}
> Jeśli użyłem
> zapisu // w gensub ...
Co to jest "zapis // w gensub"????
Ponadto awk może nadać wartości zmiennych w bloku BEGIN, tak jak w
przykładzie wyżej, i do tego shell jest zupełnie zbyteczne.
Michał
Re: [awk]Przekazanie argumentu funkcji do wyrażenia regularnego
Author: piecia aka dracorp
Date: Thu, 13 Jan 2011 13:39
Date: Thu, 13 Jan 2011 13:39
17 lines
1546 bytes
1546 bytes
Dnia Thu, 13 Jan 2011 02:30:45 +0000, Michal Jaegermann napisał(a): > Co to jest "zapis // w gensub"???? Czasem z braku słów takie dziwolągi wychodzą. > Ponadto awk może nadać wartości zmiennych w bloku BEGIN, tak jak w > przykładzie wyżej, i do tego shell jest zupełnie zbyteczne. Wiem, to był tylko przykład w którym grzebałem. Domyślnie to był skrypt basha ale nie stoi nic na przeszkodzie żeby interpreterem był awk. -- piecia aka dracorp pisz na: piotr kropka rogoza at wp kropka eu
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