TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET
내 Linux 시스템에 파일 이름이 있고 그 파일 이름을 추출하기만 하면 됩니다 TRNPRD.STD.BSRE
.
다음 명령을 시도했습니다.
echo TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET | awk -F'.' '{for(i=0;++i<=NF-5;) printf $i".";}'
그러나 원하는 결과를 반환하고 끝에 필요하지 않은 추가 점이 있습니다.
TRNPRD.STD.BSRE.
내가 여기서 무엇을 놓치고 있는지 말해 줄 수 있는 사람이 있나요?
답변1
이 작업에는 약간 과잉이므로 cut
여기에서 사용하는 것이 좋습니다 .awk
$ echo TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET | cut -d . -f -3
TRNPRD.STD.BSRE
답변2
인쇄 한 다음 추가 하라고 지시했기 때문에 명령 awk
이 추가됩니다 . 따라서 extra 로 시작합니다 ..
$i
.
.
$ echo TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET |
awk -F'.' '{for(i=0;++i<=NF-6;) printf $i"."; print $(NF-5)}'
TRNPRD.STD.BSRE
또는 처음 3개를 직접 인쇄합니다.
$ echo TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET |
grep -oP '^([^.]+\.){2}[^.]+'
TRNPRD.STD.BSRE
물론 원래 방법을 사용하여 중복 항목을 삭제할 수도 있습니다 .
.
$ echo TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET |
awk -F'.' '{for(i=0;++i<=NF- 5;) printf $i".";}' | sed 's/\.$//'
TRNPRD.STD.BSRE$
그러나 가장 좋고 간단한 해결책은cut
@Panki가 제안한대로.
답변3
문자열에서 점으로 구분된 마지막 5개의 하위 문자열을 제거하려면 다음을 수행하십시오.
$ name=TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET
$ echo "${name%.*.*.*.*.*}"
TRNPRD.STD.BSRE
이것이 적용됩니다표준 매개변수 확장값의 끝에서 지정된 패턴과 일치하는 하위 문자열을 제거합니다 $name
.
네가 원한다면유지하다문자열에서 점으로 구분된 처음 세 개의 하위 문자열:
$ name=TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET
$ echo "${name%.${name#*.*.*.}}"
TRNPRD.STD.BSRE
$name
먼저 사용 ${name#*.*.*.}
( #
왼쪽에서 제거/시작, %
오른쪽에서 제거/끝)에서 처음 세 자리 숫자를 제거한 다음 결과를 사용하여 문자열의 꼬리를 제거하고 처음 세 개의 점으로 구분된 비트를 남겨 둡니다.
$name
다음 제안은 in 의 값 에 개행 문자가 포함되어 있지 않은 한 작동합니다(표준 텍스트 처리 도구를 사용하는 모든 솔루션에서 문제가 됨).
코드 awk
에서는 항상 각 필드 끝에 점을 인쇄합니다. 약간 더 강력하게 만들려면 다음과 같은 것을 사용할 수 있습니다.
awk -v OFS="." '{ n=split($0,a,"\."); $0=""; for (i=1; i<=3 && i<=n; ++i) $i=a[i]; print }' <<<"$name"
값을 포인트로 분할한 다음 값의 처음 세 부분에 대한 출력 레코드를 생성하고 인쇄합니다(출력 필드 구분 기호, OFS
포인트로 설정).
처음 3개 비트를 유지하는 대신 마지막 5개 비트를 삭제하려면 다음을 수행하세요.
awk -v OFS="." '{ n=split($0,a,"\."); $0=""; for (i=1; i<=n-5; ++i) $i=a[i]; print }' <<<"$name"