텍스트 파일의 모든 하위 도메인을 삭제하는 방법은 무엇입니까? "."를 포함하여 그 앞에 있는 모든 항목을 삭제해야 한다고 생각합니까?
입력하다:
unix.stackexchange.com
www.example.org
example.example.tld
예상 출력:
stackexchange.com
example.org
example.tld
편집하다:
하위 도메인이 없는 도메인은 변경되지 않은 상태로 유지되어야 합니다. 전체 도메인에 하위 도메인이 있는 경우에만 터치해야 합니다. 즉, "."이 2개 이상
google.com은 google.com 입력을 유지해야 합니다.
google.com
mail.google.com
예상 출력:
google.com
google.com
답변1
첫 번째 하위 도메인을 삭제하려면 다음 단계를 따르세요.
cut -d . -f 2- input
여러 수준의 하위 도메인이 있는 경우 조합을 사용하여 도메인의 마지막 두 요소를 보존 sub2.sub1.domain.com
할 수 있습니다 .cut
rev
rev input | cut -d . -f -2 | rev
답변2
견본
www.google.com
prep.ai.mit.edu
마지막 두 개의 최상위 도메인을 유지하고,
사용sed
sed 's/.*\.\(.*\..*\)/\1/'
어디
.*\.
Greedy는 모든 문자(점 포함) 및 점과 일치합니다.\( \)
일치하는 문자열을 기억하세요.*\..*
임의의 문자를 여러 번 사용(1), 임의의 문자를 여러 번 사용- (1) 상기 욕심으로 인해 포인트가 매칭되지 않습니다.
\1
처음 기억된 문자열을 불러옵니다.
사용(gnu)grep
grep -Eo '[^.]*.[^.]*$' data
google.com
mit.edu
- 정규식 패턴( ) 은 행 끝에 앵커가 있는 것을
[^.]*.[^.]*$
제외하고 대부분 위와 같이 읽습니다 .$
첫 번째 하위 도메인 제거, 사용 sed
(정보 유지, 사양 변경됨)
sed -e 's/^[^.]*\.//' data
google.com
ai.mit.edu
어디
^[^.]*\.
점이 아닌^
줄의 시작 으로 발음되며 점 으로 여러 번 발음됩니다 .[^.]
.
*
\.
- 아무것도 대체되지 않았습니다.
- 주석에서 언급했듯이 이것은 (줄이 점으로 시작하지 않는 경우)
sed
로 단축될 수 있습니다 .'s/[^.]*.//'
답변3
.
해당 필드가 행의 구분된 마지막 두 필드가 될 것으로 판단되면 다음을 사용할 수 있습니다.
$ awk -F. -v OFS='.' '{print $(NF-1),$NF}' file
stackexchange.com
example.org
example.tld
또는 sed
:
$ sed 's/.*\.\([^.]*\..*\)$/\1/' file
stackexchange.com
example.org
example.tld
그리고 sed
지원 한다면 -E
약간 더 깔끔해집니다.
sed -E 's/.*\.([^.]*\..*)$/\1/' file
stackexchange.com
example.org
example.tld
답변4
기준을 사용하여 sed
마지막 및 마지막에서 두 번째 구성 요소를 제외한 모든 구성 요소를 제거합니다 .
sed 's/.*\.\(.*\..*\)/\1/'
불행하게도 이 정규 표현식은 폭풍우 이후의 숲처럼 보입니다. 단계별로 구축해 봅시다:
.*\.
점으로 끝나는 임의 개수의 문자(점 포함)입니다.- 표현식 뒤에는 또 다른 점이 필요하므로
.*\.
시작부터 두 번째 점까지 모든 것이 일치됩니다. - 이제 우리는 줄의 나머지 부분에 점이 하나만 있다고 확신합니다(말 그대로 점이므로
.*\..*
나머지 부분과 일치시키기에 충분합니다). \(\)
교체 시 재활용할 수 있도록 이 잔해를 내부에 넣고\1
나머지는 모두 버립니다.
시각적 설명:
subdomain.domain.tld
sub1.sub2.domain.tld
`--v----´ `-v--´ `v´
.* \. .* \. .*