2013-06-29 4 views
6

GNU sed와 GNU grep에서 \b\<의 차이점을 이해하지 못합니다. 그것은 내게 \b 항상 \<\\>을 일치하는 문자열 집합을 변경하지 않고 바꿀 수있는 것 같습니다.sed와 grep의 단어의 시작과 끝

특히, \bsomething\\< something 이 정확히 동일한 문자열과 일치하지 않는 예제를 찾으려고합니다.

동일한 질문은 something\bsomething\\>입니다.

는 단어 경계의 두 유형 사이의 유일한 차이는 LinuxTopia에 따르면 당신에게

+0

다른 정규식 규칙 세트. 그들은 동등하지만 철자가 다릅니다. –

+0

또한 답변을 승인 된 것으로 표시하십시오. 이것으로 당신은 당신의 신뢰성을 높일 것이고 사람들은 당신의 질문에 대답하기 위해 더 많은 노력을 기울일 것입니다. –

답변

9

(더 일반적인) \b 또는 (보다 구체적인) \<\> 중 어느 것을 사용하든 거의 차이가 없다고 생각합니다. 그러나 나는 그 예를 생각해 볼 수 있습니다. 이것은 매우 고안된 것이며, 나는 실제적인 정규 표현식 사용에서 차이를 만들지 않을 것이라고 의심하지만, 적어도 일 수 있다는 것을 증명해야한다. 나는 다음과 같은 텍스트가있는 경우

:

this is his pig 

을 나는 경우 /\bis\b/ 일치를 알고 싶은 경우에 내가 대신 /\<is\>/을 사용 또는 내가 대신 /\>is\</

을 사용하지만 경우에도 문제가없는 것입니다 내 대신 텍스트가되었습니다.

is this his pig 

'is'앞에 더 이상 단어 - 최종 경계가 없으며 단어 - 초기 경계 만 있습니다./\bis\b/와 일치하고 물론 /\<is\>/도 사용하지만 /\>is\</은 그렇지 않습니다.

실제로이 구분을 할 수 있어야한다는 것은 일반적인 것이 아니기 때문에 적어도 정규 표현식에 대한 일반적인 단어 경계 표식은 \b입니다.

+7

그냥 즐겨 찾기를 추가하려면 : OS X에서 [[: <:]] and [[:> :]] 단어 경계를 사용해야합니다. \ b 또는 \ <사용은 작동하지 않습니다. –

+0

감사합니다. @PetrusRepo! 알아두면 편리합니다. – iconoclast

+0

음,'/ \>은 \'는 왼쪽에 단어 문자가 있고 오른쪽에 단어가없는 경우 일치합니다. 그러나 단어 문자 인 오른쪽에 'i'가 표시되기를 기대합니다. –

1

감사 대부분 나오지 버전에서 작업 \< 동안 및 \>; 시스템이 을 사용하는 경우에만 후자 \b 작품

를 gsed 그리고 위키에서 인용 :

이 기호로는 '\ <'와 '>'(gsed, ssed, sed15, sed16, sedmod) 및 '\ b'및 '\ B'(gsed 전용).

두 개가 동일합니다.

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

당신의 대답에 감사드립니다. – anilomjf

+0

질문자가 어떤 버전의 sed를 지원하는지에 관해서는 생각하지 않습니다. 그의 버전은이 두 가지를 모두 지원하는 것으로 보이며, 그의 질문은 여러분이 하나를 사용하든 다른 것을 사용하든 실용적인 차이가 있는지 여부에 관한 것입니다. – iconoclast

6

\<이 단어가 아닌 단어의 전환과 일치 : 또한 여기에 단어 경계를 사용하는 모든 가능한 시나리오를 설명하는 테이블이다.

\>은 단어에서 비 단어로의 전환과 일치합니다.

\b은 확장 정규식에서 (\<|\>)과 동일합니다.

따라서 \b\<은 동일하지 않습니다. 나는 \b\<의 상위 집합이라고 말하고 싶습니다. 그 반대는 \b\>입니다.

+0

네,하지만 차이를 만드는 실질적인 예를 들어 줄 수 있습니까? '\ <' or '\> '대신'\ b'를 사용하여 다른 결과를 얻을 수있는 정규식 (및 일치시킬 텍스트)이 있습니까? – iconoclast

+0

@iconoclast 누군가는 오래전에 대답 했어야했다. 단어/단어가 아닌 문자가없는 경우 효과가 있습니다. 'sed 's/\>/#/g''는'sed'/ \ b/#/g '와 같은 일을하지 않을 것입니다. 경계 단어 바로 옆에 단어 나 단어가 아닌 단어 (또는 그 중 하나가 분명히있는 클래스)가있는 경우에는 모호하지 않게 동일한 동작을합니다. – Taywee

+0

@Tayeeee iconclast는 3 년 전. [자신의 질문에 답변] (https://stackoverflow.com/a/25491198/1743811). – doubleDown

1

나는 이전에 그런 예를 발견했습니다.
\ <. \>는 한 글자 단어와 일치합니다.
\ b를 사용하면 \ b [^] \ b와 같은 것을 넣어야합니다. \ b. \ b는 두 단어 사이의 공백과 일치하기 때문입니다.

관련 문제