2012-10-29 2 views
7

IP 주소의 세 번째 부분을 대체하기 위해 다음 sed one 라이너를 작성했습니다.확장 정규 표현식과 캡쳐 그룹을 사용하여 Sed

sed 's/192\.168\.[0-9]*\.\([0-9]*\)/192.168.15.\1/g' 

192.168.0.1 
192.168.15.1 

나는 정규 표현식을 확장 ??를 사용하여 게으른이 192.168.15192.168.0을 대체 할 수 있도록 만들고 싶어하지만 난 '-r'옵션을 제공 할 때 다음과 같은 오류가 발생합니다.

$ sed -r 's/192\.168\.[0-9]*\.\([0-9]*\)/192.168.15.\1/g' 
sed: -e expression #1, char 44: invalid reference \1 on `s' command's RHS 

캡처 그룹을 사용하면서 게으른 표현식을 만드는 방법에 대해 설명 할 수 있습니까?

참고 : 많은 다른 접근법을 사용하여 예제를 얻을 수 있습니다. 제 질문은 예제를 해결하는 방법이 아닙니다. 내가 extened regexp 및 캡처 그룹 sed 사용에 흥미 롭습니다.

+1

N.B. 'sed -r 's/192 \ .168 (\. [0-9] *) {2} /192.168.15 \ 1/g ''는 같은 결과를 얻습니다. 역 참조'\ 1'는 두 개의'(\. [0-9] *) {2}'를 사용하고 regexp의 중복을 피합니다. – potong

+0

더 깨끗하고,'sed -r 's/192 \ .168 (\. [0-9] *) {2} /192.168.15 \ 1/g ''을 다루기 때문에 게으른 표현을 만들 때도 도움이됩니다. 3 부분의 경우에 후행의'.'가 붙습니다. –

답변

8

([0-9]*)이 유효한 기호와 일치하는 기호 그룹이기 때문에 중괄호를 이스케이프 할 필요가 없습니다.

$> echo "192.168.0.1" | sed -r 's/192\.168\.[0-9]*\.([0-9]*)/192\.168\.15\.\1/g' 
192.168.15.1 
+0

파일에서 바꾸는 경우 -ir을 사용하면 작동하지 않을 수 있습니다. 이 경우'sed -i -r 's /.../.../ file'과 같이 옵션을 별도로 전달해야합니다 (또는 철자가있는 버전을 사용하십시오 :'sed --in-place --regexp-extended 's /.../.../ file "). – waldyrious