sed에서 욕심 많은 (마지 못한) 정규 표현식 일치?


406

sed를 사용하여 URL 줄을 정리하여 도메인 만 추출하려고합니다.

그래서 :

http://www.suepearson.co.uk/product/174/71/3816/

내가 원하는:

http://www.suepearson.co.uk/

(후행 슬래시 유무에 관계없이 중요하지 않습니다)

나는 시도했다 :

 sed 's|\(http:\/\/.*?\/\).*|\1|'

(비 욕심 많은 정량자를 피함)

sed 's|\(http:\/\/.*\?\/\).*|\1|'

그러나 나는 탐욕스럽지 않은 수량 자 ( ?)를 작동시킬 수 없으므로 항상 전체 문자열과 일치하게됩니다.


54
참고 : "|"로 정규 표현식을 구분하면 "/"를 벗어날 필요가 없습니다. 실제로 대부분의 사람들은 "|" "피켓 펜스"를 피하기 위해 "/"대신.
AttishOculus

12
@AttishOculus sed의 대체 표현식에서 's'뒤의 첫 문자는 구분 기호입니다. 따라서 's ^ foo ^ bar ^'또는 's! foo! bar!' 또한 작동
Squidly

1
정규 표현식을 확장하려면을 사용하십시오 sed -E 's.... 여전히, 꺼리는 운영자가 없습니다.
Ondra Žižka

질문 제목에 대답하지 않지만이 특별한 경우에는 간단한 cut -d'/' -f1-3작업입니다.
Petr Javorik

답변:


421

기본적이거나 확장 된 Posix / GNU 정규식은 욕심없는 정량자를 인식하지 못합니다. 나중에 정규식이 필요합니다. 다행히도이 컨텍스트에 대한 Perl 정규식은 다음과 같이 쉽게 얻을 수 있습니다.

perl -pe 's|(http://.*?/).*|\1|'

12
이를 위해 옵션을 사용하십시오 -pi -e.
reallynice

11
이런 내가 짜증이 일을 :-) 유일한 것은 내 스크립트가 플러스 측면에서 펄 의존성을 :-(가 지금 믿을 수 없어 담배, 거의 모든 리눅스 배포판은 이미 아마 문제를 :-) 펄을하지 않은
Freedom_Ben

6
@Freedom_Ben : POSIX에 IIRC perl필요합니다
MestreLion

4
@ dolphus333 : "기본 또는 확장 된 Posix / GNU 정규식은 욕심없는 수량자를 인식하지 않습니다"는 "sed에서 욕심없는 수량자를 사용할 수 없음"을 의미합니다.
혼돈

3
@ Sérgio 그것은 당신이 요청한 일을 수행하는 방법입니다. 이는 불가능 sed합니다.와 기본적으로 동일한 구문을 사용하여sed
chaos

250

이 특정 경우, 욕심없는 정규식을 사용하지 않고도 작업을 수행 할 수 있습니다.

이 욕심없는 정규식 [^/]*대신 다음을 시도하십시오 .*?.

sed 's|\(http://[^/]*/\).*|\1|g'

3
이 기술을 사용하여 sed match를 욕심없는 문구로 만드는 방법은 무엇입니까?
user3694243

6
불행히도 당신은 할 수 없습니다; 혼돈의 답변을 참조하십시오 .
Daniel H

많은 리눅스 배포판에서 perl이 더 이상 기본 설치 기반이 아니기 때문에 많은 감사드립니다!
st0ne


@DanielH 사실 요청 된대로이 기법사용하여 구문을 불쾌하게 일치시킬 수 있습니다 . 충분한 정밀도로 두 패턴을 작성하려면 약간의 고통이 필요할 수 있습니다. 예를 들어 URL 쿼리에서 키-값 할당을 구문 분석 할 때을 사용하여 계층 지정을 지정해야 할 수도 있습니다 ([^&=#]+)=([^&#]*). 예를 들어, 최종 슬래시가있는 호스트 부분 및 경로 이름의 URL을 구문 분석하는 것이 선택적으로 캡쳐에서 제외되는 것으로 가정 할 때 이러한 방식으로 작동하지 않는 경우가 있습니다.^(http:\/\/.+?)/?$
Thomas Urban

121

sed를 사용하면 일반적으로 구분 기호까지 구분 기호를 제외한 모든 항목을 검색하여 욕심없는 검색을 구현합니다.

echo "http://www.suon.co.uk/product/1/7/3/" | sed -n 's;\(http://[^/]*\)/.*;\1;p'

산출:

http://www.suon.co.uk

이것은:

  • 출력하지 않습니다 -n
  • 검색, 패턴 일치, 교체 및 인쇄 s/<pattern>/<replace>/p
  • 사용하는 ;검색 명령 구분을 대신 /하므로 입력하기 쉽도록하기 위해s;<pattern>;<replace>;p
  • 괄호 사이의 일치를 기억하십시오 \(... \), 나중에 \1, \2...
  • 시합 http://
  • 괄호 안에 아무것도 다음에 [], [ab/]의미 중 하나 a또는 b또는/
  • 처음 ^[]수단 not, 그래서 아무것도 뒤에 만의 것[]
  • 그래서 [^/]제외하고는 아무것도 의미 /의 문자를
  • *이전 그룹을 반복하는 것이므로를 [^/]*제외한 문자를 의미합니다 /.
  • 지금까지는 sed -n 's;\(http://[^/]*\)검색하고 기억하고 http://뒤에 /찾은 것을 제외한 모든 문자를 의미합니다.
  • 우리는 도메인의 끝까지 검색하고 싶기 때문에 다음에 멈추고 끝에 /다른 것을 추가 하고 싶습니다./sed -n 's;\(http://[^/]*\)/'.*
  • 이제 그룹 1 ( \1) 에서 기억 된 일치 는 도메인이므로 일치하는 줄을 그룹에 저장된 내용으로 바꾸고 \1인쇄하십시오.sed -n 's;\(http://[^/]*\)/.*;\1;p'

도메인 뒤에 백 슬래시를 포함 시키려면 그룹에 백 슬래시를 하나 더 추가하여 기억하십시오.

echo "http://www.suon.co.uk/product/1/7/3/" | sed -n 's;\(http://[^/]*/\).*;\1;p'

산출:

http://www.suon.co.uk/

8
최근 편집 내용 : 괄호는 일종의 괄호 문자이므로 괄호라고 부릅니다. 특히 저자와 같이 실제 문자로 단어를 따르는 경우에는 괄호라고 부릅니다. 또한 일부 문화권에서는 선호되는 사용법이므로 자신의 문화권에서 선호하는 사용법으로 바꾸는 것은 다소 무례한 것처럼 보이지만 편집자가 의도 한 것은 아닙니다. 개인적으로 둥근 대괄호 , 대괄호꺾쇠 괄호 와 같이 순수하게 설명적인 이름을 사용하는 것이 가장 좋습니다 .
Alan Moore

2
구분 기호를 문자열로 바꿀 수 있습니까?
Calculemus

37

sed는 "욕심없는"연산자를 지원하지 않습니다.

일치에서 "/"를 제외 시키려면 "[]"연산자를 사용해야합니다.

sed 's,\(http://[^/]*\)/.*,\1,'

PS "/"를 백 슬래시 할 필요가 없습니다.


실제로는 아닙니다. 구분자가 가능한 많은 문자 중 하나 일 수있는 경우 (예 : 문자열 만 해당), 부정 일치는 점점 더 복잡해질 수 있습니다. 괜찮습니다.. * 욕심쟁이
gesell

1
질문은 더 일반적이었다. 이 솔루션은 URL에서 작동하지만 후행 0을 제거하는 유스 케이스에서는 작동하지 않습니다. s/([[:digit:]]\.[[1-9]]*)0*/\1/분명히 잘 작동하지 않을 것입니다 1.20300. 원래 질문은 URL에 관한 것이 었으므로 허용 된 답변에 언급해야합니다.
Daniel H

33

에 게으른 (심지어) 수량화 시뮬레이션 sed

그리고 다른 모든 정규식 맛!

  1. 식의 첫 항목 찾기 :

    • POSIX ERE ( -r옵션 사용 )

      정규식 :

      (EXPRESSION).*|.

      sed :

      sed -r 's/(EXPRESSION).*|./\1/g' # Global `g` modifier should be on

      예 (첫 번째 숫자 찾기) 라이브 데모 :

      $ sed -r 's/([0-9]+).*|./\1/g' <<< 'foo 12 bar 34'
      12

      어떻게 작동 합니까?

      이 정규 표현식은 교대로부터 이익을 얻는다 |. 각 위치 엔진에서 그와 함께가는 의미 (이 아니라 다른 엔진의 몇 다음에하는 POSIX 표준입니다) 가장 긴 일치를 선택하려고 .일치가 발견 될 때까지 ([0-9]+).*. 그러나 질서도 중요합니다.

      여기에 이미지 설명을 입력하십시오

      글로벌 플래그가 설정되었으므로 엔진은 입력 문자열 또는 대상의 끝까지 문자별로 문자를 계속 일치시킵니다. 교대로 왼쪽의 첫 번째 및 유일한 캡처 그룹이 일치 (EXPRESSION)하자마자 나머지 라인도 즉시 소비됩니다 .*. 우리는 이제 첫 번째 캡처 그룹에서 가치를 유지합니다.

    • POSIX BRE

      정규식 :

      \(\(\(EXPRESSION\).*\)*.\)*

      sed :

      sed 's/\(\(\(EXPRESSION\).*\)*.\)*/\3/'

      예 (첫 번째 일련의 숫자 찾기) :

      $ sed 's/\(\(\([0-9]\{1,\}\).*\)*.\)*/\3/' <<< 'foo 12 bar 34'
      12

      이 버전은 ERE 버전과 유사하지만 다른 변경 사항이 없습니다. 그게 다야. 각 단일 위치에서 엔진은 숫자를 일치 시키려고합니다.

      여기에 이미지 설명을 입력하십시오

      그것이 발견되면, 다른 다음 숫자가 소비되고 캡처되고 나머지 줄은 즉시 일치합니다. 그렇지 않으면 더 많거나 0을* 의미 하기 때문에 두 번째 캡처 그룹을 건너 뛰고 \(\([0-9]\{1,\}\).*\)*.하나에 도달 하여 단일 문자와 일치 하며이 프로세스는 계속됩니다.

  2. 구분 된 표현식 의 첫 항목 찾기 :

    이 방법은 구분 된 문자열의 첫 항목과 일치합니다. 이것을 문자열 블록이라고 부를 수 있습니다.

    sed 's/\(END-DELIMITER-EXPRESSION\).*/\1/; \
         s/\(\(START-DELIMITER-EXPRESSION.*\)*.\)*/\1/g'

    입력 문자열 :

    foobar start block #1 end barfoo start block #2 end

    -EDE : end

    -SDE : start

    $ sed 's/\(end\).*/\1/; s/\(\(start.*\)*.\)*/\1/g'

    산출:

    start block #1 end

    첫 번째 정규 표현식 \(end\).*은 첫 번째 구분 기호를 일치시키고 캡처하며, 마지막 구분 기호 인 end최근 캡처 된 문자로 모든 일치를 대체합니다. 이 단계에서 출력은 다음과 같습니다 foobar start block #1 end.

    여기에 이미지 설명을 입력하십시오

    그런 다음 \(\(start.*\)*.\)*위의 POSIX BRE 버전과 동일한 두 번째 정규식으로 결과가 전달됩니다 . 시작 구분 기호 start가 일치하지 않으면 단일 문자 와 일치하고 그렇지 않으면 시작 구분 기호와 일치하고 캡처하고 나머지 문자와 일치합니다.

    여기에 이미지 설명을 입력하십시오


질문에 직접 대답

접근법 # 2 (구분 된 표현식)를 사용하여 두 가지 적절한 표현식을 선택해야합니다.

  • EDE : [^:/]\/

  • SDE : http:

용법:

$ sed 's/\([^:/]\/\).*/\1/g; s/\(\(http:.*\)*.\)*/\1/' <<< 'http://www.suepearson.co.uk/product/174/71/3816/'

산출:

http://www.suepearson.co.uk/

참고 : 동일한 구분 기호로 작동하지 않습니다.


3) 데모 용 regex101과 같은 사이트를 제안하면서 구문 및 기능 차이로 인해 cli 도구에 항상 적합하지는 않습니다.
Sundeep

1
@Sundeep 감사합니다. 나는 모든 따옴표를 작은 따옴표로 바꿨다. 또한 가장 왼쪽 일치 규칙을 언급하는 것으로 간주했습니다. 그러나 sed동일한 표준 순서를 따르는 다른 모든 엔진 은 평등에 관해서 중요 합니다. 그래서 echo 'foo 1' | sed -r 's/.|([0-9]+).*/\1/g'경기를하지 않지만 echo 'foo 1' | sed -r 's/([0-9]+).*|./\1/g'않습니다.
revo

@Sundeep은 구분 식에 대한 해결 방법 이 메모를 추가 한 동일한 시작 및 끝 구분 기호에 대해 작동하지 않았습니다 .
revo

다른 교대는 동일한 위치에서 시작하고 같은 길이가 때이 설명서에 기재되어있는 경우, 즉 다른 엔진처럼 왼쪽에서 오른쪽의 순서로 .. 찾아 볼 필요에 따라 겠네 무슨 일에 대해 좋은 점
Sundeep

여기에 이상한 경우가 있습니다 : stackoverflow.com/questions/59683820/…
Sundeep

20

하나 이상의 캐릭터를위한 욕심없는 해결책

이 스레드는 실제로 오래되었지만 사람들이 여전히 필요하다고 생각합니다. 의 첫 번째 발생까지 모든 것을 죽이고 싶다고 가정 해 봅시다 HELLO. 당신은 말할 수 없습니다 [^HELLO]...

따라서 좋은 해결책은 입력에서 예상하지 않은 고유 한 단어를 절약 할 수 있다고 가정하면 두 단계로 구성됩니다 top_sekrit.

이 경우 다음을 수행 할 수 있습니다.

s/HELLO/top_sekrit/     #will only replace the very first occurrence
s/.*top_sekrit//        #kill everything till end of the first HELLO

물론 더 간단한 입력으로 더 작은 단어를 사용하거나 단일 문자를 사용할 수도 있습니다.

HTH!


4
사용하지 않는 문자를 기대할 수없는 상황에서 더 유용하고 유용하게 사용하려면 다음과 같이하십시오. 1. 특수 문자를 실제로 사용하지 않는 WORD로 바꾸십시오. 2. 종료 순서를 특수 문자로 바꾸십시오. 특수 문자를 대체하십시오. 5. 특수 단어를 대체하십시오. 예를 들어, <hello>와 </ hello> 사이의 탐욕스러운 연산자를 원합니다.
Jakub

3
예 : echo "찾기 : <hello> fir ~ st <br> 예 </ hello> <hello> sec ~ ond </ hello>"| sed -e "s, ~, VERYSPECIAL, g"-e "s, </ hello>, ~, g"-e "s,. * 찾기 : <hello> ([^ ~] *). *, \ 1 , "-e"s, \ ~, </ hello>, "-e"s, VERYSPECIAL, ~, "
Jakub

2
동의한다. 좋은 해결책. 나는 사용하지 않을 수 없다면 ~ s / ~ / VERYspeciaL / g를 사용하여 현재 발생을 교체 한 다음 위의 트릭을 수행 한 다음 s / VERYspeciaL / ~ / g를 사용하여 원래를 반환하십시오.
ishahak

1
나는 이런 종류의 일에 희귀 한 "변수"를 사용하는 경향이 있으므로 대신을 `사용합니다 <$$>( $$쉘에서 프로세스 ID로 확장되므로 작은 따옴표 대신 큰 따옴표를 사용해야하지만 정규식의 다른 부분을 손상시킬 수 있음) 또는 유니 코드를 사용할 수있는 경우와 같은 것 <∈∋>입니다.
Adam Katz

어떤 시점에서 당신은 그냥 사용하지 않는 이유를 스스로에게 물어가 perlpython대신에 다른 언어를 나. perl한 줄에 덜 허약 한 방식 으로이 작업을 수행합니다 ...
ArtOfWarfare

18

sed-Christoph Sieghart의 욕심없는 매칭

sed에서 욕심없는 일치를 얻는 트릭은 일치하는 문자를 제외하고 모든 문자를 일치시키는 것입니다. 나도 알다시피, 그러나 그것은 귀중한 시간을 낭비하고 쉘 스크립트는 결국 빠르고 쉬워야합니다. 따라서 다른 사람이 필요할 수있는 경우 :

욕심 매칭

% echo "<b>foo</b>bar" | sed 's/<.*>//g'
bar

욕심없는 매칭

% echo "<b>foo</b>bar" | sed 's/<[^>]*>//g'
foobar

17

이것은 cut을 사용하여 수행 할 수 있습니다.

echo "http://www.suepearson.co.uk/product/174/71/3816/" | cut -d'/' -f1-3

9

정규식을 사용하지 않는 또 다른 방법은 필드 / 구분 기호 방법을 사용하는 것입니다.

string="http://www.suepearson.co.uk/product/174/71/3816/"
echo $string | awk -F"/" '{print $1,$2,$3}' OFS="/"

5

sed 확실히 그 자리가 있지만 이것은 그들 중 하나가 아닙니다!

Dee가 지적했듯이 : 그냥 사용하십시오 cut. 이 경우 훨씬 간단하고 안전합니다. 다음은 Bash 구문을 사용하여 URL에서 다양한 구성 요소를 추출하는 예입니다.

url="http://www.suepearson.co.uk/product/174/71/3816/"

protocol=$(echo "$url" | cut -d':' -f1)
host=$(echo "$url" | cut -d'/' -f3)
urlhost=$(echo "$url" | cut -d'/' -f1-3)
urlpath=$(echo "$url" | cut -d'/' -f4-)

당신에게 제공합니다 :

protocol = "http"
host = "www.suepearson.co.uk"
urlhost = "http://www.suepearson.co.uk"
urlpath = "product/174/71/3816/"

보다시피, 이것은 훨씬 더 유연한 접근법입니다.

(디에게 모든 크레딧)


3
sed 's|(http:\/\/[^\/]+\/).*|\1|'

1
"|"를 사용하면 구분자로 "/"를 이스케이프 할 필요가 없습니다.
Michael Back

3

sed -E는 정규식을 확장 (현대) 정규식으로 해석합니다.

업데이트 : MacOS X의 경우 -E, GNU sed의 경우 -r


4
아니에요 ... 적어도 GNU sed는 아닙니다.
Michel de Ruiter

7
보다 광범위하게 -E는 BSD sed와 OS X에 고유 합니다. 매뉴얼 페이지에 링크합니다. @stephancheg의 수정에 언급 된대로 -r확장 정규 표현식을 GNU에sed 가져옵니다 . 'nix 배포판에서 알려진 가변성 명령을 사용할 때주의하십시오. 나는 그것이 어려운 길을 배웠다.
fny

1
sed를 사용하려는 경우 정답이며 초기 질문에 가장 적합합니다.
Will Tice

8
GNU sed의 -r옵션 Appendix A Extended regular expressions은 info 파일과 몇 가지 빠른 테스트 에 따라 이스케이프 규칙 만 변경합니다 . 실제로 탐욕 GNU sed version 4.2.1
스럽지

1
GNU sed -E는 한동안 문서화되지 않은 옵션으로 인식 되었지만 릴리스 4.2.2.177 에서는이를 반영하도록 문서가 업데이트되었으므로 -E이제는 둘 다 좋습니다.
Benjamin W.

3

순수한 sed를 사용 하여이 문제를 해결하기를 희망합니다. 이 방법은 일반적인 해결책은 아니지만 "루프"를 사용하여 다음과 같이 문자열의 불필요한 부분을 모두 제거 할 수 있습니다.

sed -r -e ":loop" -e 's|(http://.+)/.*|\1|' -e "t loop"
  • -r : 확장 정규식 사용 (+ 및 이스케이프 처리되지 않은 괄호)
  • ": loop": "loop"라는 새 레이블을 정의하십시오.
  • -e : sed에 명령 추가
  • "t loop": 대체가 성공한 경우 "loop"레이블로 다시 이동

여기서 유일한 문제는 마지막 구분 문자 ( '/')도 자르는 것이지만 실제로 필요한 경우 "루프"가 끝난 후에도 간단히 다시 넣을 수 있습니다. 이전 명령 끝에 추가 명령을 추가하십시오. 명령 줄 :

-e "s,$,/,"

2

펄, 컷 등 대신 sed를 사용하려한다고 구체적으로 언급 했으므로 그룹화를 시도하십시오. 이로 인해 탐욕스럽지 않은 식별자가 인식되지 않을 수 있습니다. 첫 번째 그룹은 프로토콜입니다 (예 : 'http : //', 'https : //', 'tcp : //'등). 두 번째 그룹은 도메인입니다.

에코 "http://www.suon.co.uk/product/1/7/3/"| sed "s | ^ \ (. * // \) \ ([^ /] * \). * $ | \ 1 \ 2 |"

그룹화에 익숙하지 않은 경우 여기 에서 시작 하십시오 .


1

나는 이것이 오래된 항목이라는 것을 알고 있지만 누군가가 유용하다고 생각할 수 있습니다. 전체 도메인 이름은 총 253자를 초과 할 수 없으므로. *를. \ {1, 255 \}로 바꾸십시오.


1

이것은 sed를 사용하여 다중 문자 문자열을 욕심없이 일치시키는 방법입니다. 당신이 모든을 변경하고 싶은 말은하자 foo...bar<foo...bar>너무 예를 들어이 입력 :

$ cat file
ABC foo DEF bar GHI foo KLM bar NOP foo QRS bar TUV

이 출력이되어야합니다 :

ABC <foo DEF bar> GHI <foo KLM bar> NOP <foo QRS bar> TUV

그렇게하려면 foo와 bar를 개별 문자로 변환 한 다음 그 문자의 부정을 사용하십시오.

$ sed 's/@/@A/g; s/{/@B/g; s/}/@C/g; s/foo/{/g; s/bar/}/g; s/{[^{}]*}/<&>/g; s/}/bar/g; s/{/foo/g; s/@C/}/g; s/@B/{/g; s/@A/@/g' file
ABC <foo DEF bar> GHI <foo KLM bar> NOP <foo QRS bar> TUV

위 :

  1. s/@/@A/g; s/{/@B/g; s/}/@C/g인 변환 {하고 }그 다음 문자 변환 가능하므로 자리 문자열에 그 입력에 존재할 수 foobar 것이다.
  2. s/foo/{/g; s/bar/}/g변환된다 foobar{그리고 }각각
  3. s/{[^{}]*}/<&>/g변환 - 우리가 원하는 연산을 수행 foo...bar<foo...bar>
  4. s/}/bar/g; s/{/foo/g변환된다 {하고 }다시 foobar.
  5. s/@C/}/g; s/@B/{/g; s/@A/@/g 자리 표시 자 문자열을 원래 문자로 다시 변환합니다.

위의 단계는 첫 번째 단계에서 이러한 문자열을 제조 할 때 입력에 존재하지 않는 특정 문자열에 의존하지 않으며 {[^{}]*}필요한만큼 여러 번 사용할 수 있기 때문에 일치하는 특정 정규 표현식의 발생을 신경 쓰지 않습니다. 표현식에서 원하는 실제 일치 및 / 또는 seds 숫자 일치 연산자를 분리합니다 (예 : 두 번째 항목 만 대체).

$ sed 's/@/@A/g; s/{/@B/g; s/}/@C/g; s/foo/{/g; s/bar/}/g; s/{[^{}]*}/<&>/2; s/}/bar/g; s/{/foo/g; s/@C/}/g; s/@B/{/g; s/@A/@/g' file
ABC foo DEF bar GHI <foo KLM bar> NOP foo QRS bar TUV

1

아직이 답을 보지 못했다, 그래서 여기에 당신이 할 수있는 방법 vi이나 vim:

vi -c '%s/\(http:\/\/.\{-}\/\).*/\1/ge | wq' file &>/dev/null

이렇게하면 vi :%s전역 적으로 대체 (후행 g) 가 실행되고 패턴을 찾을 수없는 경우 오류가 발생하지 않도록하고 ( e) 결과 변경 사항을 디스크에 저장하고 종료합니다. 그만큼&>/dev/null 하면 GUI가 화면에서 잠깐 동안 깜박이지 않아 성 가실 수 있습니다.

나는 vi(1) perl이 죽어 가고 있기 때문에 (2) vim은 매우 복잡한 정규 표현식에 때때로 사용하는 것을 좋아합니다. 진보 된 정규식 엔진을 가지고 있으며, (3) 이미 친밀하게 익숙 정규 표현식에 사용 것을 좋아합니다.vi 일상적인 사용법 편집에서 서류.


0
echo "/home/one/two/three/myfile.txt" | sed 's|\(.*\)/.*|\1|'

귀찮게, 나는 다른 포럼에서 그것을 얻었다 :)


4
그래서 당신은 욕심이 일치합니다 : /home/one/two/three/, 당신이 탐욕스럽게 일치하는 것과 /같은 다른 것을 추가 /home/one/two/three/four/myfile.txt하면 four: /home/one/two/three/four욕심에 관한 질문
stefanB

0

sed 's|\(http:\/\/www\.[a-z.0-9]*\/\).*|\1| 너무 작동


0

다음은 2 단계 접근 방식과 awk로 수행 할 수있는 작업입니다.

A=http://www.suepearson.co.uk/product/174/71/3816/  
echo $A|awk '  
{  
  var=gensub(///,"||",3,$0) ;  
  sub(/\|\|.*/,"",var);  
  print var  
}'  

출력 : http://www.suepearson.co.uk

희망이 도움이됩니다!


0

다른 sed 버전 :

sed 's|/[:alnum:].*||' file.txt

/줄 끝까지의 나머지 문자뿐만 아니라 영숫자 문자 (따라서 다른 슬래시도 아님) 가 뒤에옵니다. 그 후에는 아무것도 대체하지 않습니다 (즉, 삭제합니다).


1
나는 "[[:alnum:]]"그렇지 않은 것 같아요 "[:alphanum:]".
oli_arborum
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.