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