2016-12-07 1 views
1

나는 단어를 찾아야합니다.grep은 두 공백 사이의 글자를 찾습니다.

제 과제에서 단어는 두 공백 사이의 문자 ("bla")로 정의됩니다. this 같은 decimalIntegerConstant를 찾아야하지만 단어가 있어야합니다. 예를 들어,

나는

grep -E -o " (0|[1-9]+[0-9]*)([Ll]?) " 

를 사용하지만 그것은 작동하지 않습니다 :

즐 0리터 labl 2 3 abla0La 0L는 출력

0l 
2 
0L 

입니다 sfdgpočítačsd

이지만 3이 누락되었습니다.

+3

'2'와 (와) 일치하면 공간을 소비합니다. ''grep -oP ''(0 | [1-9] + [0-9] *) [Ll]? (? =) "' – 123

+0

@ 123 라인의 시작/끝을 고려하고 공백을 없애기 위해 출력에서'grep -oP "(^ |) \ K ((0 | [1-9] + [0-9] *) [Ll]?) (? = | $) "' – Aserre

+0

@Aserre 나는 두 개의 공백 사이에서 OP 정의 단어로 의도적으로 그것을 복잡하게 만들지는 않았지만 할 수 있었다. – 123

답변

1

일치하는 항목이 중복되지 않습니다. 귀하의 정규식은 2과 일치합니다. 2 이후의 공란은 없어졌습니다. 추가 경기는 고려하지 않습니다.

입니다
grep -o ' [0-9 ]* ' | grep -E -o '[0-9]+' 

, 시퀀스 일치 ([lL]을 지원하지 않습니다, 당신의 정규식에서 간체)

POSIX grep는 한 번에 당신이 원하는 것을 할 수는 없지만 두 단계에서이 같은 작업을 수행 할 수 있습니다 공백으로 구분 된 숫자를 앞뒤 공백으로 구분하여 공백에 관계없이 개별 숫자와 일치시킵니다. 귀하의 필요에 맞게 번호의 정의를 단순화하십시오.

grep -oP " (0|[1-9]+[0-9]*)[Ll]?(?=)" 

(?=)grep은 앞서 볼 것이다 의미 내다 주장입니다 : 코멘트에 언급 한 바와 같이

펄 호환 정규 표현식은, 예를 들어,을 사용하지 않고 물건을 일치 수있는 방법이 입력 스트림을 확인하고 그 뒤에 일치하는 공백이 있는지 확인하십시오. 공백은 경기의 일부로 간주되지 않으며 소비되지 않습니다. 공백이 없으면 일치하지 않습니다.

PCRE는 grep의 모든 구현에서 작동하지 않을 수도 있습니다.

편집 : -o은 Posix에서 지정하지 않습니다.

+0

답변을 제공하지 않습니다. 해당 코드는 OP 데이터에 적용되지 않습니다. – 123

+0

@ 123 답변은 반드시 "기본적으로 작동하는 코드"로 정의되는 것이 아니라 "솔루션에 도달하는 데 도움이되는 유용한 정보"로 정의됩니다. 그렇게 말하면, 답이 좋지 않다고 생각하면 자유롭게 downvote/flag를 사용하십시오. –

+0

전혀 작동하지 않습니다. '+'는 BRE가 아닙니다. 그리고 posix grep은'-o'를 지원하지 않습니다 – 123