2017-05-15 5 views
1

이것은 캡처 그룹 sed의 sipmlest 가능한 예제 중 하나처럼 보이며 작동하지 않습니다. 나는 온라인 정규 표현식 테스터에서 정규식을 테스트했고, 내가 원하는 것을 수행했다. 리눅스 커맨드 라인에서는 그렇지 않습니다.Sed 캡처 그룹이 작동하지 않습니다.

$ echo "a 10 b 12" | sed -E -n 's/a ([0-9]+)/\1/p' 
$ 

$ echo "a 10 b 12" | sed -E -n 's/a ([0-9]+)/\1/p' 
10 b 12 

https://regex101.com/r/WS3lG9/1

나는 "10"을 기대

캡처합니다.

+1

그것은 캡처를 수행에게 밖으로 물고기 grep를 사용할 수 sed와 문자열을 대체 '10'. sed 캡쳐 그룹을 다룰 때는 전체 라인을 그 일부가 아닌 것으로 간주해야합니다. – RomanPerekhrest

+0

10을 캡처하여 10으로 바꾸고 나머지 라인은 일치하지 않으며 동일하게 유지됩니다. – 123

+3

왜 출력이 다른 두 개의 동일한 명령이 있습니까? – 123

답변

4

일치 후 일치하는 문자열 (예 : a [0-9]+)을 소비하지 않으므로 sed 패턴이 전체 라인과 일치하지 않습니다. 이것이 출력물에 남아있는 텍스트를 보는 이유입니다.

당신은 사용할 수 있습니다

echo "a 10 b 12" | sed -E -n 's/a ([0-9]+).*/\1/p' 
10 

또는 단지를 :

echo "a 10 b 12" | sed -E 's/a ([0-9]+).*/\1/' 
10 
+0

그래, 나는 여분의 물건을 맞추어야 할 때 정말 절대로 안왔다. 거기에 좋은 규칙이 있습니까? 정규식 테스터는 왜 신경 쓰지 않습니까? – abalter

+0

대체품이나 대체품으로'sed'를 사용하고 있습니다. [regex101에서 동일하게한다면] (https://regex101.com/r/WS3lG9/2) 그 때'. *'를 사용하여 끝까지 일치시켜야합니다. – anubhava

+3

@abalter 규칙은 - 당신이 그것을 할 필요가있을 때, 당신이 그것을 필요로하지 않을 때 그것을하지 않습니다. 이 경우 sed가 전체 라인을 숫자 '10'으로 대체하기를 원할 것입니다. 물론 전체 라인과 일치하는 정규 표현식을 작성해야합니다. 'a ([0-9] +). *'는'a 10 10 '과 일치하는'a 10 b 12'전체 줄과 일치하지 않는 반면, 정규 표현식'a ([0-9] +). *'는 전선. –

1

대신 당신이 경기

echo "a 10 b 12" | grep -Po '(?<=a)\d+' 
관련 문제