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
다음을, 내가 나오지도를 통해 실행하겠습니다
- 먼저 문자열을 정규 표현식
\([[:digit:]]\+\)
으로 일치시킵니다.이 표현식은 "하나 이상의 숫자가 포함 된 일치 문자열"을 의미합니다. 여기에 부분 문자열을 표시하려면s
-command-style\(
및\)
괄호도 사용하십시오 (허용 되나요?). - 일치하는 경우
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'
을, 즉
/^Number: \([[:digit:]]\+\)$/
- 모든 문자열과 일치 종류가Number: 12345
이고 일치하는 경우 :s,,#NUMBER: (\1),
-로 바꿉니다.p
- 명확한 패턴 공간, 새로운주기을 (새로운 라인을 가져오고 스크립트 처음부터 발현 분석 시작)
q 1
시작 - - 그것은d
인쇄 코드 1.이 명령을 종료 내 경우에는 '허용되지 않는 문자열'을 의미하며 오류가 발생해야하는 '일치하지 않는'사례를 확인합니다 (d
명령 존재로 인해) 1 단계에서 일치하는 항목이없는 경우에만 실행됩니다.대체이 '정상's/match/replace/
명령을 사용할 때 수없는 장소를했다 후 여기
홈페이지 트릭은 p
및 d
명령을 실행했다.