2011-02-16 3 views
5

grep을 사용하여 마지막 공백을 가져 오려고합니다.grep을 사용하여 정규 표현식의 마지막 문자를 가져 오는 방법

이 나에게 최초의 공간을 잡아 :

나는 비 욕심 연산자를 사용했을하지만이 작동하지 않는 자바에서는
echo "toto tata titi" | grep -o " .*$" 

:

echo "toto tata titi" | grep -o " .*?$" 

그것은 아무것도에게

를 반환하지

예상되는 결과는 titi입니다.

답변

6

.[^ ]으로 바꾸십시오. 그렇다면 탐욕 스러울 수 있습니다.

echo "toto tata titi" | grep -o " [^ ]*$" 

(당신이 grep 확장 된 정규 표현식에를 사용하거나 egrep 또는 grep -E을 사용합니다.)

+0

당신의 정규식은 내가하고 싶었던 일을합니다. 고마워요. 하지만 왜 내가 내 -E와 함께 작동하지 않는지 아십니까? – JPB

+0

@ Jean-Philippe : 정규식은 제목 문자열에 왼쪽에서 오른쪽으로 적용되므로 첫 번째 공간에서 시작하여 점차 끝까지 확장되어 성공합니다. 더 이상 자세를 취할 필요가 없습니다. –

+0

@Jean :'/. *? $ /'매치는 먼저 공백을 찾고 거기에서 매칭을 시작합니다. 문자열의 끝까지 일치를 유지하고 완료됩니다. 욕심이없는 것은 해석자가 현재 유닛 ('.')을 계속 검색할지 아니면 다음 유닛과 일치시킬지를 결정할 때만 작용합니다. 그것은 가장 짧은 해결책을 찾을 때까지 역 추적하지 않습니다. – Tim

1

편집이 : 난 그냥이 게시물에 대한 더 나은 대답을했다,하지만, 어쨌든이 게시대로 수도 당신이 물건을 대체하는 것 같은 더 복잡한 것을하고 싶다면 도움이 될 것입니다.

을 :

으로이 작업을 수행하는 또 다른 방법은 sed 명령을 사용하고 괄호로 변수 \1에 수집되는 (당신이 원하는 것을 제외하고 모든 (정규식에 먼저 s 명령으로) 대체 할 수 있도록하는 것입니다 기본적으로

echo "toto tata titi" | sed -r "s/.*(.*?)$/\1/" 
1

, 당신이 바로 마지막 필드의 첫 번째 문자를 점점하고있다. 정규식보다 더 가까이 방법은 필드에 문자열을 나눌 수있는 도구를 사용하고있다 "문자열 - 보내고".

$ echo "toto tata titi" | awk '{print substr($NF,0,1)}' 
t 


$ echo "toto tata titi" | ruby -ane 'puts $F[-1][0]' 
t 
관련 문제