2009-03-13 19 views
5

Chciałbym uzyskać wszystkie wystąpienia [0-9A-Z]+? do przetwarzania później. mamJak uzyskać wszystkie dopasowania z regex?

if [[ `cat file` =~ '[0-9A-Z]+?' ]]; then 
    echo $BASH_REMATCH; 
fi 

co daje mi pierwszy mecz, ale w jaki sposób mogę przetwarzać wszystkie mecze w pliku?

Dziękuję

+0

Czy chcesz dodać? na końcu wzoru? – Richard

Odpowiedz

5

Jeśli chcesz uzyskać tylko dopasowany tekst wyrażenia regularnego, użyłbym

grep -o 'regex' file 

W duchu kodzie bym go zmodyfikować, aby być

while read line; do 
    [[ $line =~ regex ]] || continue 
    # do somethinw with $line or $BASH_REMATCH, perhaps put it in an array. 
done < file 

Jeśli chcesz dopasować wiele wyrażeń regularnych w tej samej linii, oto sposób.

while read line; do 
    # do somethinw with $line 
done < <(grep -o 'regex' file) 

Zakładam, że Twój regex ma być uproszczonym przykładem tego, co naprawdę robisz. ? nie jest pomocny, a twoje cytaty pasują do literału.

+0

Regex jest nieco bardziej skomplikowany, +? jest potrzebny, aby być leniwym. Mimo że "while ... done

+0

Co się stanie, jeśli jedna linia zawiera dwukrotnie dopasowanie do wyrażenia regularnego? Jak mogę to przetworzyć? –

+0

zobacz zaktualizowaną odpowiedź –

Powiązane problemy