2014-04-22 2 views
1

정규 표현식에 대한 도움을 요청하고 싶습니다. 각 URL에서 마지막 부분을 추출해야합니다. 아래 예제에서 'to_extract'로 표시했습니다. file.txt를의정규식 도움말 - 뭐가 잘못 되었나요?

sed 's/^[ht|f]tp.*\///' file.txt 

샘플 내용 : 나는 FTP 링크 만 정확한 결과를 얻고있다

http://a/b/c/to_extract 
ftp://a/b/c/to_extract 
... 

내가 나오지도 함께 사용하면 다음과 같은 정규식 잘못 알고 싶어 , http를 위해 아닙니다. 이것에 대한 설명에 미리 감사드립니다. i.

답변

8

[ht|f]에서 (ht|f)으로 변경하면 더 나은 결과를 얻을 수 있습니다.

[abc]은 "a, b 또는 c"의 문자를 의미합니다.

[ht|f]는 "h, t, | 또는 f 하나 개의 문자는"당신이 원하는 전혀 것을 의미한다. 확장 된 정규 표현식을 사용할 수 있도록

나오지도의 일부 버전에

, 당신은 -r 옵션을 호출해야합니다 :

sed -r 's/^(ht|f)tp.*\///' file.txt 

그냥 URL과 돈의 마지막 부분을 추출 할 경우 'T는 당신이 아마

sed -rn 's/^(ht|f)tp.*\///p' file.txt 
+0

한 단지 정보를 원하시면, GNU가 나오지에,하지 POSIX 버전 taht를가'허용하지 않습니다 작동 |''없이 – NeronLeVelu

+2

당신이 많은'sed' 방언에 괄호 및 파이프 문자를 백 슬래시 필요 -r'. 'sed '/ \ (ht \ | f \) tp /''는 GNU sed와도 잘 작동합니다. – tripleee

+0

@tripleee 그 정보를 주셔서 감사합니다 (필자는 아직도 r 매개 변수를 사용하는 것이 더 읽기 쉽고 편리하다고 생각하기 때문에 대답을 계속합니다). –

1

을 원하는, 무엇을 원하는 방법 사용에 대한 "기본 이름"

basename http://a/b/c/to_extract  
to_extract  

당신은 for 루프로 원하는 것을 얻을 수 있습니다.

#!/bin/bash 

myarr=($(cat ooo)) 

for i in ${myarr[@]}; do 

basename $i 

done 
+0

왜 sed를 사용할 수있을 때 루프를 작성합니까? 어떻게 URL을 포함하지 않는 줄을 처리합니까? –

+0

@dystroy 확실히, 나는 sed가 모두가 사용하고 싶은 첫 번째 우선 순위라고 생각한다. 나는 정규식없이 일반적인 경우를 다룰 수있는 또 다른 방법이 있다고 말하고 싶다. 그러나 어쨌든, 당신 말이 맞다. – liltme

관련 문제