Z języka programowania Awk
Funkcja
sub ( r, s , t )
najpierw znajduje najdłuższy podciąg z lewej strony dopasowany przez wyrażenie regularner
w 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ładbanana
jest 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