많은 수의 URL이 포함된 출력 파일이 있다고 가정해 보겠습니다. awk 또는 sed를 사용하여 URL의 일부를 제거하여 최종 결과 http://example.com
가 http://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
sed
URL이 한 줄에 하나씩 있거나 공백으로 구분되어 있다고 가정하여 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