2014-04-16 2 views
1

sed를 실험 중이며 최근에는 흥미로운 동작을 발견했습니다. 그러나 설명하는 설명서를 찾을 수 없습니다.Sed : 's'명령에서 regexp와 일치하는 역 참조 문자열

우리가 파일 'sedtest'라는 것을 상상해 상당히 쉬웠다

$cat sedtest | sed '/\([[:digit:]]\+\)/s,,(\1),' 
hello (0) world 
example 
(4) sed 
Phone number: (123)-456-789 

이해 나오지 스크립트 :

$cat sedtest 
hello 0 world 
example 
4 sed 
Phone number: 123-456-789 

다음을, 내가 나오지도를 통해 실행하겠습니다

  1. 먼저 문자열을 정규 표현식 \([[:digit:]]\+\)으로 일치시킵니다.이 표현식은 "하나 이상의 숫자가 포함 된 일치 문자열"을 의미합니다. 여기에 부분 문자열을 표시하려면 s -command-style \(\) 괄호도 사용하십시오 (허용 되나요?).
  2. 일치하는 경우 s 명령 s,,(\1), (공백 정규 표현식 필드 사용)으로 진행되면 "일치하는 하위 문자열을 (\1)으로 바꿉니다"를 의미합니다.

처음에 나는 \1과 유사한 역 참조는이 경우 비어 s 명령 정규 필드에서 문자열에 대해서만 작업을해야하기 때문에이 오류로 실패해야한다고 생각했다.

결과는 마치 s,\([[:digit:]]\+\),(\1), 스크립트 (\regexp\ 일치하는 사람이 s 명령 일치 자 필드로 이동 한 것처럼)입니다!

\regexp\ 규칙과 일치하는 하위 문자열을 역 참조하는 것이 정상적인 것입니까 (예 : s//replace/ 명령이 s/regexp/replace/ 명령과 일치하는 것처럼)?

P.

내 나오지 버전입니다 : GNU는 4.2.1

을 나오지도 그리고 질문 뒤에 동기는 당신이 뭔가 할 수있는 방법입니다

sed '/^Number: \([[:digit:]]\+\)$/{s,,#NUMBER: (\1),;p;d};q 1'을, 즉

  1. /^Number: \([[:digit:]]\+\)$/ - 모든 문자열과 일치 종류가 Number: 12345이고 일치하는 경우 :
    • s,,#NUMBER: (\1), -로 바꿉니다.
    • p - 명확한 패턴 공간, 새로운주기을 (새로운 라인을 가져오고 스크립트 처음부터 발현 분석 시작)
  2. q 1 시작 - - 그것은
  3. d 인쇄 코드 1.이 명령을 종료 내 경우에는 '허용되지 않는 문자열'을 의미하며 오류가 발생해야하는 '일치하지 않는'사례를 확인합니다 (d 명령 존재로 인해) 1 단계에서 일치하는 항목이없는 경우에만 실행됩니다.대체이 '정상's/match/replace/ 명령을 사용할 때 수없는 장소를했다 후 여기

홈페이지 트릭은 pd 명령을 실행했다.

답변

1

정상입니다. 다른 참조 작업을 수행하지 않으면 뒤로 참조 대기 공간이 지워지지 않습니다. s에 대한 귀하의 정규식이 null이므로 \1은 그 이전의 캡처 그룹을 나타냅니다. 당신은 차이를 볼 수 있습니다 또한 a이 자리

$ sed '/\([[:digit:]]\+\)/s,\(a\),(\1),' sedtest 
hello 0 world 
example 
4 sed 
Phone number: 123-456-789 

아무것도 일치하지 않습니다 (라인,하지만 다시 참조는

e

$sed '/\([[:digit:]]\+\)/s,\(e\),(\1),' 
h(e)llo 0 world 
example 
4 s(e)d 
Phon(e) number: 123-456-789 
일치하고이 역 참조되고 삭제 된 보유

.

이 동작을 원하지 않는다면, \(\) 주위에 [[:digit:]]을 두어 뒤에 참조를 생성해서는 안됩니다.