Wyszukiwanie liczb w grep

0

Witam, bardzo bym prosił o wytłumaczenie poniższego rozwiązania dla polecenia : "Znaleźć wiersze w których występują dwie takie same liczby "

grep ‘(<[0-9]+>).*<\1>’ dane

rozumiem że <[0-9] oznacza szukanie wyrazu zaczynającego sie od dowolnej cyfry jednak co oznacza fragment **+ **
oraz **.*<\1> **
Prosze o pomoc,pozdrawiam

2

Plus w wyrażeniach regularnych oznacza najczęściej 1 lub więcej razy, stąd [0-9]+ oznacza ciąg jednej lub więcej cyfry. .* to dowolny znak (kropka) występujący 0 lub więcej razy (gwiazdka). \1 to wartość pierwszej grupy znalezionej.

Backslashe są tutaj dodane, aby interpreter nie traktował tego jako znaki specjalne, a jako elementy przekazywane do polecenia grep.

0

Dziękuję za pomoc a jeszcze dla przypadku :

znaleźć linie w której występuje 5 liczb
Rozwiązanie działające
egrep '^\s(<[0-9]+> ){5}$' liczby

jednak dlaczego dla przypadku

  • '^\s*(<[0-9]+>*){5}$'** liczby (usunięta spacja pomiędzy > a ) wyszukiwanie już nie działa lub rozwiązując to w inny sposób :
    egrep "^\s[0-9]+(\s+[0-9]+\s+){3}[0-9]+\s$"
    * liczby również nie działa
0

Kwantyfikatory (?, +, *) dotyczą pojedynczego wyrażenia przed nimi.

/abc*/ Tutaj gwiazdka odnosi się tylko do c.

W Twoim pierwszym przypadku gwiazdka dotyczy spacji. W drugim tylko znaku >. Spróbuj wsadzić wyrażenie z liczbami w nawias.

0

A czym się różni oznaczenie \s* od samej spacji z * ?

0

Wyrażenia i kwantyfikatory to zupełnie inne rzeczy w wyrażeniach regularnych.

Pojedynczy znak np a, s, 9, x znaczą dokładnie to co przedstawiają, czyli as9 matchuje dokładnie as9.
Wyrażenia specjalne takie jak \s albo \d znaczą "dowolny whitespace" albo "dowolna cyfra". Czyli np \d zmatchuje 9 ale zmatchuje też 8 albo 0. "Dowolny whitespace" to spacja, enter albo tab. Kropka . matchuje każdy znak.

Kwantyfikatory, np +, ?, *, {10}, {3,14} określają ile raz poprzedzające je wyrażenie może się pojawić.
Czyli np a{10} matchuje tylko wyrażenie aaaaaaaaaa (10 razy a). Podobnie jak a{4,10} pasuje do ilości liter a od 4ech do 10.
Wyrażenie a* oznacza dowolną ilość liter a (również zero tych liter, czyli pusty string). Ciąg a+b? oznacza "jeden lub więcej znaków a" oraz "jeden lub zero znaków b".

Wracając do Twojego pytania, \s* znaczy dowolna ilość whitespaców (dlatego że \s znaczy dowolny whitespace (enter/tab/spacja) a * znaczy dowolna ilość tych znaków). Za to sama spacja i gwiazdka, czyli * znaczy "dowolna ilość spacji".

0

Dziękuję za odpowiedź ale w takim razie skoro \s zawiera w sobie również spacje to dlaczego zapis egrep '^\s*(<[0-9]+>\s*){5}$' liczby nie przechodzi (zamieniłem ...> * na ...>\s*) ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1