awk 또는 sed를 사용하여 http://example.com 이후의 모든 항목을 삭제하는 방법

awk 또는 sed를 사용하여 http://example.com 이후의 모든 항목을 삭제하는 방법

많은 수의 URL이 포함된 출력 파일이 있다고 가정해 보겠습니다. awk 또는 sed를 사용하여 URL의 일부를 제거하여 최종 결과 http://example.comhttp://example.com/folder/file.html.

답변1

첫 번째 싱글(더블 아님) 이후의 모든 항목을 제거하려면 다음을 수행하세요 /.

sed -r 's#([^/])/[^/].*#\1#'

이 표현식은 s#([^/])/[^/].*#\1#정규 표현식을 사용하여 교체를 수행합니다 ([^/])/[^/].*. 이는 /단일 문자 /(및 입력 줄 끝에 있는 다른 문자) 가 뒤에 오지 않는 모든 문자와 일치합니다 .

바꾸기는 일치하는 항목을 단일 문자 앞의 문자 /(그렇지 않으면 대체됨)로 바꿉니다.

파일에서 테스트해 보세요

http://example.com/folder/file.html
http://example.bar.com/folder/file.html
http://example.com:8080/folder/file.html
$ sed -r 's#([^/])/[^/].*#\1#' file
http://example.com
http://example.bar.com
http://example.com:8080

사용 awk:

$ awk -F'/' '{ print $1 "//" $3 }' file
http://example.com
http://example.bar.com
http://example.com:8080

여기서는 필드 구분 기호로 사용 /하고 첫 번째와 세 번째 필드를 선택하고 //그 사이의 문자열을 사용하여 출력합니다.

답변2

당신이 사용할 수있는 sed:

 sed 's#^\(https\?://\)\?\([^/]*\)/.*#\1\2#' filename

이 명령과 다음 파일을 사용하십시오.

http://example.com/foo/bar.html
https://example.com/foo/bar.html
example.com/foo/bar.html

출력은 다음과 같습니다

http://example.com
https://example.com
example.com

작동 방식은 다음과 같습니다.

  • \(https\?://\)\?http://또는 의 최대 1개 발생과 일치합니다 https://. 대괄호는 일치 항목을 캡처합니다.\1

  • \([^/]*\)이 이후부터 다음까지 일치하며 /일치 항목은 다음에서 캡처됩니다.\2

  • /.*나머지 줄과 일치합니다.

답변3

sedURL이 한 줄에 하나씩 있거나 공백으로 구분되어 있다고 가정하여 URL의 후행 부분을 제거하는 데 사용됩니다 .

sed 's!\(http://[^/]*\)[^ ]*!\1!g' < input > output

이는 sed의 검색 및 바꾸기 기능을 사용합니다. 패턴, 교체 및 플래그 사이의 구분 기호는 여기에서 설정됩니다 !.

일치시킬 패턴은 다음과 같습니다.

  • http://슬래시를 제외한 모든 항목 - 패턴의 이 부분은 괄호 안에 "그룹 1"로 표시됩니다.
  • (공백을 제외한 모든 항목), 0회 이상 - 이는 특히 URL의 후행 부분입니다.아니요괄호 안에 캡처

대안은 다음과 같습니다.

  • 이전에 캡처한 "그룹 1"

플래그는 다음과 같습니다

  • 전역적으로 수행합니다 g. 즉, 한 줄에 가능한 한 여러 번 수행합니다.

답변4

대용량 파일의 경우 grep작업이 빠르게 완료될 수 있습니다. 구문도 기억하기 쉽습니다.

grep -Eo '^https?://[^/]+' fname

사용 sed에는 이상이 필요하지 않습니다.

sed -r 's|(https?://[^/]*).*|\1|' fname

아니면 cut어려운 정규식을 사용하지 마세요

cut -d'/' -f1,2,3 fname

관련 정보