2013-03-20 3 views
0

그래서, stdin에서 파일을 읽고, 정확히 3 '/'가 포함 된 줄의 '/'를 모두 삭제하고 출력을 stdout에 씁니다. 그래서 파일이 포함되어sed를 사용하여 쉘 스크립트 작성

a1bc 
/a/b2 

/a 

나는 이런 식으로 뭔가를 생각하고있다 : 그러나

sed -r 's/\/[^\/]*\/[^\/]*\/.*/"I not sure what do I need to put in here"/g' 

, 내가 넣어해야합니까 정말로 확실하지 않다

/a1/b/c 
/a/b2 
/// 
/a 

가 출력이됩니다 교체 세션에서.

+0

안녕하세요 프로그래머에 오신 것을 환영합니다. 구현 관련 질문은 주제와 관련이 없습니다. 이 질문은 Stack Overflow에 관한 주제이지만 이미 게시 한 것 같습니다. 제발 크로스 포스트하지 마. 즐거운 하루 되세요. –

+0

'/ opt/hal/9000/monitor'와 같이 4 줄 이상의 슬래시가있는 샘플 라인이 있어야합니다. 그것은 또한 변하지 않게 남겨 두어야한다. –

답변

2

sed를 솔루션 :

sed '/.*\/.*\/.*\//{s#/##g}' file 

펄은 당신을 위해 확인하는 경우 :

perl -F/ -ape '[email protected]>3?join"",@F:join "/",@F;' file 
+0

sed 만 사용할 수 있습니다 –

+0

sed 솔루션을 추가했습니다 – Guru

+0

"{s #/## g}"은 무엇을 의미합니까? 당신이 생각하지 않는다면, 내가 그것을 아무것도 대체하지 않으면 '/'만 삭제하는 대신 전체 줄을 지울 것입니다. –

0
sed -e '/^[^\/]*\/[^\/]*\/[^\/]*\/[^\/]*$/ s%/%%g' 

끔찍한 패턴, 라인의 시작을 0 개 이상의 비 슬래시의 순서를 본다 그 다음에 슬래시, 비 슬래시 및 두 번째 슬래시, 더 많은 비 슬래시 및 세 번째 슬래시, 더 많은 슬래시 및 줄 끝이옵니다. 그와 일치하는 행에서 전역으로는 대 체를 사용하지 마십시오.

정규 표현식을 작성하는 다른 방법이 있지만 상당히 명확하지는 않습니다. 이것은 거의 모든 버전의 sed에서 작동합니다. 그래서 것이 :

것 같습니다
sed -e '/^\([^\/]*\/\)\{3\}[^\/]*$/ s%/%%g' 

라인의 시작을위한, (슬래시 다음에 0 개 이상의 비 슬래시), 0 개 이상의 비 슬래시 라인의 끝의 3 대.

sed에 확장 정규 표현식 (예 : GNU sed)이있는 경우 표기법의 편의를 얻을 수 있습니다.

sed -r -e '/^([^\/]*\/){3}[^\/]*$/ s%/%%g' 

sed -r -e 's%^([^/]*)/([^/]*)/([^/]*)/([^/]*)$%\1\2\3\4%' 

후자는 '0 개 이상의 슬래시가 아닌'세트를 캡처하여 함께 붙여 붙여 교체합니다. 확장되지 않은 정규식을 사용하여이를 작성할 수는 있지만 이전보다 백 슬래시가 더 많이 포함됩니다.

-1

awk 훨씬 간단하다 :

awk -F/ 'NF==4 { gsub("/","") } {print}' tmp.txt 
+1

Guru의 대답은 프로그램을 sed해야한다는 것을 나타냅니다. –

관련 문제