다음 텍스트가 있습니다.
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
입력 구분 기호로 지정한 -
다음 마지막 두 필드를 제외한 모든 필드를 인쇄합니다.