🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#72124
Author: piecia aka dracorp
Date: Tue, 11 Jan 2011 08:44
36 lines
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
#72125
Author: Michal Jaegermann
Date: Thu, 13 Jan 2011 02:30
35 lines
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
#72126
Author: piecia aka dracorp
Date: Thu, 13 Jan 2011 13:39
17 lines
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