2013-06-29 15 views
6

Nie rozumiem różnicy między \b a \< w GNU sed i GNU grep. Wydaje mi się, żezawsze może zastąpić \< i \\> bez zmiany zestawu pasujących ciągów. W szczególności próbuję znaleźć przykłady, w których \bsomething i \\< something nie pasują dokładnie do tych samych ciągów.Początek i koniec słów w sed i grep

To samo pytanie dla something\b i something\\>.

Dziękuję

+0

Po prostu różne zestawy konwencji regex; są one równoważne, ale inaczej napisane. –

+0

również prosimy o zaznaczenie odpowiedzi jako zaakceptowanej. dzięki temu zwiększysz swoją wiarygodność, a ludzie będą wkładać więcej wysiłku w odpowiedzi na twoje pytania. –

Odpowiedz

9

Podejrzewam, że bardzo rzadko robi różnicę, czy używają (bardziej powszechne) \b lub (bardziej szczegółowe) \< i \>, ale mogę myśleć przykład gdzie to będzie. Jest to dość wymyślne i podejrzewam, że w większości zastosowań regexu w świecie rzeczywistym nie miałoby to znaczenia, ale powinno to wykazać, że w niektórych przypadkach może to być co najmniej może być.

Jeśli mam następujący tekst:

this is his pig 

i chcę wiedzieć, czy /\bis\b/ mecze, to nie będzie miało znaczenia, jeśli zamiast stosować /\<is\>/ albo ja zamiast stosować /\>is\</

Ale co, jeśli mój zamiast tego tekst był:

is this his pig 

Nie ma już granicy wyrazu przed końcem "jest", tylko słowo-początkowa granica.Używając dopasowań i oczywiście /\<is\>/ również, ale nie.

W rzeczywistości jednak nie jest tak często, że naprawdę trzeba umieć dokonać tego rozróżnienia, dlatego (przynajmniej poza sed) \b jest normalnym znacznikiem granic dla wyrażeń regularnych.

+7

Wystarczy dodać zakładkę: na OS X musisz użyć [[: <:]] and [[:>:]] dla granicy słowa. Używanie \ b lub \

+0

Dzięki @PetrusRepo! To przydatne wiedzieć. – iconoclast

+0

Um, '/ \> is \' pasuje, jeśli po lewej stronie znajduje się znak słowny, a po prawej nie ma wyrazu. Ale spodziewamy się również zobaczyć "i" po prawej, która jest słowem. –

1

Według LinuxTopia jedyna różnica między dwoma rodzaju granice słów jest to, że podczas gdy \< i \> pracy w wersjach najbardziej sed; Te ostatnie \b działa tylko wtedy, gdy system będzie używał gsed

I cytat z wiki:

Te symbole to '\ <' i '>' (gsed, ssed, sed15, sed16, sedmod) oraz "\ b" i "\ B" (tylko w przypadku gsed).

Poza tym dwa są identyczne. Również tutaj znajduje się tabela, która wyjaśnia wszystkie możliwe scenariusze, które używają granice słowo:

Match position  Possible word boundaries HHsed GNU sed 
    --------------------------------------------------------------- 
    start of word [nonword char]^[word char]  \< \< or \b 
    end of word   [word char]^[nonword char] \> \> or \b 
    middle of word  [word char]^[word char]  none  \B 
    outside of word [nonword char]^[nonword char] none  \B 
    --------------------------------------------------------------- 
+0

Dziękuję za odpowiedź. – anilomjf

+0

Nie sądzę, że pytający zastanawia się, które wersje sed wspierają konwencje. Jego wersja wydaje się wspierać oba, a jego pytanie wydaje się dotyczyć tego, czy robi to jakąkolwiek praktyczną różnicę, czy używasz jednego czy drugiego. – iconoclast

6

\< mecze przejścia z braku słowa do słowa.

\> dopasowuje przejście od słowa do słowa.

\b jest odpowiednikiem (\<|\>) w rozszerzonym wyrażeniu regularnym.

Więc nie powiem, że \b i \< są takie same. Powiedziałbym, że \b jest nadzbiorem \<. Odwrotnie dla \b i \>.

+0

Tak, ale czy możesz podać praktyczny przykład, w którym ma znaczenie? Czy istnieje regex (i tekst do niego pasujący), w którym uzyskasz inny wynik, używając '\ b' zamiast' \ <' or '\> '? – iconoclast

+0

@iconoclast Ktoś powinien odpowiedzieć tak dawno temu. Będzie to miało znaczenie, jeśli nie będziesz miał żadnych znaków wyrazów i słów. 'sed 's/\>/#/g'' nie robi tego samego, co' sed' s/\ b/#/g''. Jeśli masz nie-słowo lub znak słowny (lub klasę, która jest jednoznacznie jedną z nich) tuż obok meczu granicznego, jednoznacznie zachowują się tak samo. – Taywee

+0

@Taywee iconoclast zrobił [odpowiedz na własne pytanie] (https://stackoverflow.com/a/25491198/1743811) 3 lata temu. – doubleDown

1

Natknąłem się na taki przykład wcześniej.
\ <. \> Dopasowuje jednoliterowe słowo.
Używając \ b musisz umieścić coś w stylu \ b [^] \ b, ponieważ \ b. \ B dopasowuje spację między dwoma wyrazami.