sed는 첫 번째 마침표까지의 모든 항목을 제거하고(한 줄에 여러 개의 마침표가 있는 경우) 전체 파일에 대해 이 작업을 수행합니다.

sed는 첫 번째 마침표까지의 모든 항목을 제거하고(한 줄에 여러 개의 마침표가 있는 경우) 전체 파일에 대해 이 작업을 수행합니다.

sed줄에 마침표가 여러 개 있는 경우 첫 번째 마침표까지 모두 삭제하고 전체 파일에 대해 이 작업을 수행합니다.

sed 이전:

akamai.com
cdnjs.cloudflare.com
com.cdn.cloudflare.net

sed 이후:

akamai.com
cloudflare.com
cdn.cloudflare.net

답변1

$ sed '/\..*\./s/^[^.]*\.//' file
akamai.com
cloudflare.com
cdn.cloudflare.net

스크립트 sed는 먼저 정규식을 사용하여 두 개 이상의 점이 포함된 행을 일치시킵니다 \..*\.( 로 작성할 수도 있음 [.].*[.]). 이에 일치하는 라인의 경우 첫 번째 포인트까지 모든 것을 제거하여 교체가 수행됩니다.

를 사용하세요 awk. 이는 위와 비교하여 약간 장황합니다.

$ awk -F '.' -vOFS='.' 'NF > 2 { n=split($0, a); $0=""; for (i=2;i<=n;++i) $(NF+1)=a[i] } 1' file
akamai.com
cloudflare.com
cdn.cloudflare.net

여기에서는 점으로 구분된 필드가 2개 이상 있을 때마다 현재 행을 점으로 분할하고 첫 번째 필드를 건너뛰고 여기에서 현재 레코드를 다시 만듭니다. 1끝에 후행이 있으면 모든 줄이 인쇄됩니다(수정 여부에 관계없이).

awk솔루션과 같은 방식으로 더 짧습니다 sed.

$ awk -F '.' 'NF > 2 { sub("^[^.]*\.", "") } 1' file
akamai.com
cloudflare.com
cdn.cloudflare.net

답변2

이 문제를 해결하려면 다음 방법을 사용할 수 있습니다.

perl -lpe '$_ = $1 if /\.(.*\..*)/' input-file.txt

오른쪽에 있는 다른 점을 볼 수 있는 regex점 문자에 의존하는 경우입니다 . .그러면 오른쪽 콘텐츠가 캡처되어 제공되고 $1현재 행에 채워집니다. -p그러면 옵션이 일치하지 않는 옵션과 Perl함께 가져옵니다 .stdout


perl -F\\. -pale '$_ = join ".", splice @F, 1 if @F > 2' input.txt
  • 이 옵션을 사용하면 입력 파일을 한 줄씩 읽으며 -p자동 인쇄도 활성화됩니다.

  • 각 레코드는 지점에서 분할되며 .배열에 저장된 개별 필드는 @F옵션 시작에 의해 색인화됩니다.0-a

  • -l옵션이 만든다RS = ORS = "\n"

  • 배열에 2개 이상의 요소가 있는 경우에만 @F, 즉 현재 레코드에 최소 2개의 포인트가 있는 경우 수정을 위해 해당 레코드를 선택합니다.

  • 이러한 레코드의 경우 splice @F, 1함수는 두 번째 요소를 제거하고 이를 함수에 제공합니다. 함수 join는 점 문자를 사용하여 요소를 연결한 다음 $_현재 레코드에 채웁니다.

  • 그러면 이 옵션은 -p수정된 현재 레코드를 stdout으로 가져옵니다. 수정되지 않은 레코드는 어쨌든 자동으로 stdout으로 가져옵니다.


다음을 사용하여 GNU sed캡처 대괄호를 사용하지 않고도 작업을 수행할 수도 있습니다 .

sed -e 
    s/\./\n/2;T
    y/\n./.\n/
    s/\n/./2g
    s/.*\n//
' input.file

산출:

akamai.com
cloudflare.com
cdn.cloudflare.net

관련 정보