Z języka programowania Awk
Funkcja
sub ( r, s , t )najpierw znajduje najdłuższy podciąg z lewej strony dopasowany przez wyrażenie regularnerw ciągu docelowymt; następnie zastępuje podłańcuch ciągiem podstawienias.Funkcja
sub(r,s)jest synonimemsub(r,s,$0).W
sub ( /ana/, "anda" , "banana" ), na przykładbananajest zastępowane przezbandada.
Po uruchomieniu sub ( r, s , t ), jak mogę uzyskać nowy ciąg? Na przykład w sub ( /ana/, "anda" , "banana" ), jak mogę uzyskać nowy ciąg znaków bandada?
Funkcja sub zwraca liczbę dokonanych podstawień.
Czy zwrot sub jest 0 czy 1? Czy to prawda, że nie może być więcej niż jeden, ponieważ sub znajdź tylko pierwsze dopasowanie i zamień je?
Dzięki.
Odpowiedź
Z podręcznika GNU awk 9.1.3 Funkcje manipulujące ciągami :
… trzeci argument
sub()musi być zmienną, polem lub elementem tablicy. Niektóre wersje awk pozwalają, aby trzeci argument był wyrażeniem, które nie jest lwartością. W takim przypadkusub()nadal szuka wzorca i zwraca zero lub jeden, ale wynik podstawienie (jeśli istnieje) jest wyrzucane, ponieważ nie ma gdzie go umieścić. Takie wersje awk akceptują wyrażenia takie jak:
sub(/USA/, "United States", "the USA and Canada")W celu zachowania zgodności historycznej, gawk akceptuje taki błędny kod, jednak użycie dowolnego innego niezmiennego obiektu jako trzeciego parametru powoduje błąd krytyczny i program nie będzie działać.
Zatem odpowiedzią jest użycie zmiennej:
awk "BEGIN{t = "banana"; sub(/ana/,"anda",t); print t}" bandana