줄 끝에서 "-"로 구분된 하나 이상의 필드를 삭제합니다.

줄 끝에서 "-"로 구분된 하나 이상의 필드를 삭제합니다.

데이터를 분석하고 싶습니다.googleapis.txt

bucket,abc-def-ghi-45gjd4-wwxis
bucket,dde-wwq-ooi-66ciow-po22q
instance,jkl-mno-1-zzz-68dkakw-oo9w8
disk,pqr-stu-10-kuy-l2oxapw-rp4lt

아래와 같은 결과가 나올 것으로 예상합니다

bucket,abc-def-ghi
bucket,dde-wwq-ooi
instance,jkl-mno-1-zzz
disk,pqr-stu-10-kuy

-공백으로 변경 한 다음 이 명령을 실행 해야 한다고 생각합니다.

cat googleapis.txt | awk '{$NF="";sub(/[ \t]+$/,"")}1' | awk '{$NF="";sub(/[ \t]+$/,"")}1'

나는 이것에서 그것을 얻었다https://stackoverflow.com/a/27794421/8162936구문 분석 후 공백을 하이픈으로 변경하겠습니다 -.

구문 분석을 위한 모범 사례나 한 줄 셸 명령을 아는 사람이 있나요? 다들 감사 해요

답변1

함께 sed할 수 있는 일:

sed -E 's/(-[^-]*){2}$//' infile

각 줄의 끝에서 -anything비슷한 패턴을 두 번 찾아 제거하세요.(...){2}$

답변2

$ sed 's/-[[:alnum:]]*-[[:alnum:]]*$//' file
bucket,abc-def-ghi
bucket,dde-wwq-ooi
instance,jkl-mno-1-zzz
disk,pqr-stu-10-kuy

이는 sed각 줄의 대시로 구분된 마지막 두 하위 문자열과 일치하여 제거됩니다. [[:alnum:]]모든 영숫자 문자와 일치합니다.

로 단축하시면 됩니다

sed 's/\(-[[:alnum:]]*\)\{2\}$//' file

-[[:alnum:]]*즉, 각 줄의 끝에 있는 두 세트의 ath를 일치시키고 제거합니다.

GNU를 사용하면 awk다음과 같은 작업도 수행할 수 있습니다.

$ awk -F '-' 'BEGIN { OFS=FS } { NF -= 2; print }' file
bucket,abc-def-ghi
bucket,dde-wwq-ooi
instance,jkl-mno-1-zzz
disk,pqr-stu-10-kuy

그러나 NF그러한 변경은 이식 가능하지 않으므로 피해야 합니다(현재 레코드가 변경된다는 보장은 없습니다). awk예를 들어 BSD에서는 작동하지 않습니다.

Standard 를 사용하면 using (단지 모방임 )을 awk사용하지 않고 사용하려는 필드(이 경우 대시로 구분된 마지막 두 필드를 제외한 모든 필드)에서 현재 레코드를 다시 만들어야 합니다.sub()sed

$ awk -F '-' 'BEGIN { OFS=FS } { nf = split($0,a) - 2; $0=""; for (i=1; i<=nf; ++i) $i = a[i]; print }' file
bucket,abc-def-ghi
bucket,dde-wwq-ooi
instance,jkl-mno-1-zzz
disk,pqr-stu-10-kuy

답변3

그리고 :revcut

rev file | cut -d'-' -f3- | rev

라인을 반전하고 cut필드 3을 라인 끝까지 바꾼 다음 텍스트를 다시 반전시킵니다.


사용 grep(및 PCRE):

grep -Po '.*(?=(-[^-]*){2}$)' file
  • -P(?...)두 개의 일치 항목 -과 그 뒤에 문자가 아닌 -항목 이 포함된 Perl 호환 정규식을 사용하세요.
  • -o일치하는 부분만 인쇄

답변4

다음과 같이 다양한 방법으로 이 작업을 수행할 수 있습니다.

$ perl -F- -pale '$"="-";$#F-=2;$_="@F"' file

대시로 선을 분할하고, 배열 요소 커넥터를 대시로 설정하고, 마지막 두 요소를 자르고, 현재 행을 대시로 연결된 배열로 설정합니다.

$ awk -F- '{
   t = $1
   for ( i=2; i<NF-1; i++ ) t = t FS $i
   $0 = t
}1' file

이는 일반적인 문자열 처리입니다.

$ perl -lne 'print substr($_, 0, rindex($_,"-",-1+rindex($_,"-")))' file

.

$ sed -ne '
   y/-/\n/
   :a;h;s/\n/-/;/\n.*\n/ba
   g;P
' file

결과:

bucket,abc-def-ghi
bucket,dde-wwq-ooi
instance,jkl-mno-1-zzz
disk,pqr-stu-10-kuy

관련 정보