2013-03-05 1 views
2

파일에 대해 sed 문을 수행하는 데 도움이 필요하며 내가 가지고있는 것이 작동하지 않는 이유를 알 수 없습니다. 나는 철저하게 수색을했고, 각각의 결과는 비슷한 것이었지만, 왜 내가 내 결과를 기대하지 않는지는 알 수 없다.sed와 regex issue

나는 등

192.168.10.23:7020 
192.168.10.23:4520 
192.168.10.23:3320 

같은 여러 옵션을 가진 파일을 가지고 있고 기본적으로 나는 192.168.10.23:XX21와 192.168.10.23:XX20를 교체해야합니다. 그 중에서도

는, 나는 시도했습니다

192.168.10.23:702021 
192.168.10.23:452021 
192.168.10.23:332021 

도 :

192.168.10.23:702120 
192.168.10.23:452120 
192.168.10.23:332120 
: 같은 결과를 얻을 수

sed 's/\:\([0-9]\)\{2\}/\:&21/g' 

같은 결과를 얻을 수

sed 's/\:\([0-9]\)\{2\}20/\:&21/g' $file 

다른 시도는 전혀 변경되지 않거나 크게 다른 결과를 낳습니다. 나는 너무 가까이서, 아직까지는 그렇게 느낀다. 어떤 도움을 많이 주시면 감사하겠습니다!

+0

콜론은 정규 표현식에있는 메타 문자가 아닌, 그래서 당신이 그것을 탈출 할 필요가 없습니다. 아래의 해답은 솔루션을 다룹니다. 당신은 가깝지만,'&'는 정규 표현식과 일치하는 문자열 전체와 일치합니다; '\ 1'은 첫 번째'\ (... \)'시퀀스 내에서 일치하는 첫 부분을 나타냅니다. –

+0

고마워요! 내 주요 문제 "&"대 "\ 1"이라고 생각합니다. 확실히 sed man 페이지와 다른 튜토리얼을 더 공부할 필요가 있지만 이것은 나를 묶어 두는 데 확실히 도움이되었습니다. –

답변

2

수없는 이유는 방금

sed 's/20$/21/' 

뿐만 아니라, 가능한 한 원래 솔루션의 정신 대신 &

sed 's/\(:[0-9]*\)20/\121/' 

, 그것은 단지 일치하는 부분을 반복 \1를 사용 괄호로

+0

신난다, 고마워! 두 번째 예제는 완벽하게 작동했습니다. 처음에는, 나는 실종 된 b/c를 추측하고 있습니다. "..."파일에서 20으로 시작하는 포트가 있습니다. (그래서 : 2020은 존재합니다) - 내 부분에 대한 누락, 죄송합니다! 다시 한 번 감사드립니다! –

1

이 작동합니다 : 또한

sed 's/:\([0-9]\{0,3\}\)20/:\121/g' $file

, 내가 믿고있어 귀하의 포트 번호는 어느 곳이 자리에서 5 자리 포트 번호에있을 것입니다.

예 : http://regexr.com?340vk