특정 값(-)을 사용하여 문자열 삭제

특정 값(-)을 사용하여 문자열 삭제

다음 텍스트가 있습니다.

foo-11.11-fo.o-foo-bar

바-푸-11.11-22.11

두 개의 "-"가 있는 마지막 문자열을 제거하고 싶습니다.

예상 출력:

foo-11.11-fo.o

바 부자

Cut을 사용하는 여러 가지 방법을 시도했지만 아무것도 작동하지 않습니다.

답변1

사용 sed:

$ sed 's/-[^-]*-[^-]*$//' file
foo-11.11-fo.o
bar-foo

-X-X이렇게 하면 각 줄 끝에 포함되지 않은 file문자열 이 제거됩니다 .X-

문자열이 쉘 변수에 있는 경우:

$ s='foo-11.11-fo.o-foo-bar'
$ printf '%s\n' "${s%-*-*}"
foo-11.11-fo.o

$ s='bar-foo-11.11-22.11'
$ printf '%s\n' "${s%-*-*}"
bar-foo

또는 bash배열에서:

$ s=( 'foo-11.11-fo.o-foo-bar' 'bar-foo-11.11-22.11' )
$ printf '%s\n' "${s[@]%-*-*}"
foo-11.11-fo.o
bar-foo

이렇게 하면 접미사 패턴 일치/제거를 통해 -*-*변수의 문자열 끝에 있는 패턴과 일치하는 모든 항목이 제거됩니다. 배열의 s경우 s배열의 모든 요소에 대해 삭제가 수행됩니다.

답변2

$ cat ip.txt 
foo-11.11-fo.o-foo-bar
bar-foo-11.11-22.11

$ rev ip.txt
rab-oof-o.of-11.11-oof
11.22-11.11-oof-rab

$ rev ip.txt | cut -d- -f3- | rev
foo-11.11-fo.o
bar-foo

각 행을 뒤집은 다음 다음을 사용하여 cut처음 두 필드를 제외한 모든 필드를 선택합니다.


을 사용할 수도 있지만 perl입력 줄에 필드가 3개 미만인 경우 빈 줄이 인쇄됩니다.

$ perl -F'-' -lane 'print join "-", @F[0..$#F-2]' ip.txt 
foo-11.11-fo.o
bar-foo

입력 구분 기호로 지정한 -다음 마지막 두 필드를 제외한 모든 필드를 인쇄합니다.

관련 정보